diff --git a/.env.example b/.env.example index 637c1f2..d75c53c 100644 --- a/.env.example +++ b/.env.example @@ -2,3 +2,4 @@ COMPOSE_PROFILES=services PUBLIC_API_BASE_URL=/api ALLOWED_HOSTS= +FIREFLY_URL=http://127.0.0.1:8080 diff --git a/Makefile b/Makefile index 2e726d2..73753c8 100644 --- a/Makefile +++ b/Makefile @@ -3,11 +3,11 @@ COMPOSE := docker compose .PHONY: env recreate rebuild restart logs down fmt check build dev fmt: - bun run fix + bun --bun run fix check: bun run check - bun run lint + bun --bun run lint build: $(COMPOSE) build frontend diff --git a/api/firefly-iii-v1.yaml b/api/firefly-iii-v1.yaml new file mode 100644 index 0000000..bbbdd22 --- /dev/null +++ b/api/firefly-iii-v1.yaml @@ -0,0 +1,26561 @@ +openapi: 3.0.0 +servers: + - description: Firefly III demo site + url: https://demo.firefly-iii.org/api + - description: "Local development server (do not use)" + url: http://firefly.sd.internal/api +info: + title: Firefly III API v6.7.8 + + description: | + This is the documentation of the Firefly III API. Please report any bugs or issues. You may use the "Authorize" button to try the API below. +

+ Please keep in mind that the demo site does **not** accept requests from `curl`, `colly`, `wget`, etc. You must use a browser or a tool like Insomnia to make your test requests. +

+ To learn more about the idiosyncrasies of this API, please read about the API in the [Firefly III API documentation](https://docs.firefly-iii.org/references/firefly-iii/api/). +

+ This file was last generated on 2026-10-15 @ 07:31:05 (Europe/Amsterdam) + + version: "v6.7.8" + contact: + name: James Cole + email: james@firefly-iii.org + url: https://firefly-iii.org + license: + name: AGPLv3 + url: 'https://www.gnu.org/licenses/agpl-3.0.en.html' +tags: +- name: about + description: These endpoints deliver general system information, version- and meta + information. +- name: accounts + description: Endpoints that deliver all of the user's asset, expense and other accounts + (and the metadata) together with related transactions, piggy banks and other objects. + Also delivers endpoints for CRUD operations for accounts. +- name: attachments + description: Endpoints to manage the attachments of the authenticated user, including + up- and downloading of the files. +- name: autocomplete + description: Auto-complete endpoints show basic information about Firefly III models, + like the name and maybe some amounts. They all support a search query and can + be used to autocomplete data in forms. Autocomplete return values always have + a "name"-field. +- name: available_budgets + description: Endpoints to manage the total available amount that the user has made + available to themselves. Used in periodic budgeting. +- name: bills + description: Endpoints to manage a user's bills and all related objects. +- name: budgets + description: Endpoints to manage a user's budgets and get info on the related objects, + like limits. +- name: categories + description: Endpoints to manage a user's categories and get information on transactions + and other related objects. +- name: charts + description: The "charts" endpoints deliver optimised data for charts and graphs. +- name: configuration + description: These endpoints allow you to manage and update the Firefly III configuration. + You need to have the "owner" role to update configuration. +- name: currencies + description: Endpoints to manage the currencies in Firefly III. Depending on the + user's role you can also disable and enable them, or add new ones. +- name: currency_exchange_rates + description: All currency exchange rates. +- name: data + description: The "data"-endpoints manage generic Firefly III and user-specific data. +- name: insight + description: The "insight" endpoints try to deliver sums, balances and insightful + information in the broadest sense of the word. +- name: links + description: Endpoints to manage links between transactions, and manage the type + of links available. +- name: object_groups + description: Endpoints to control and manage all of the user's object groups. Can + only be created in conjunction with another object (for example a piggy bank) + and will auto-delete when no other items are linked to it. +- name: piggy_banks + description: Endpoints to control and manage all of the user's piggy banks and related + objects and information. +- name: preferences + description: These endpoints can be used to manage the user's preferences, including + some hidden ones. +- name: recurrences + description: Use these endpoints to manage the user's recurring transactions, trigger + the creation of transactions and manage the settings. +- name: rule_groups + description: Manage all of the user's groups of rules and trigger the execution + of entire groups. +- name: rules + description: These endpoints can be used to manage all of the user's rules. Also + includes triggers to execute or test rules and individual triggers. +- name: search + description: Endpoints that allow you to search through the user's financial data. + Different from the autocomplete endpoints, the search accepts more advanced arguments. +- name: summary + description: These endpoints deliver summaries, like sums, lists of numbers and + other processed information. Mainly used for the main dashboard and pretty specific + for Firefly III itself. +- name: tags + description: This endpoint manages all of the user's tags. +- name: transactions + description: The most-used endpoints in Firefly III, these endpoints are used to + manage the user's transactions. +- name: user_groups + description: User groups are the objects around which "financial administrations" + are built. +- name: users + description: Use these endpoints to manage the users registered within Firefly III. + You need to have the "owner" role to access these endpoints. +- name: webhooks + description: These endpoints can be used to manage the user's webhooks and triggers + them if necessary. + +paths: + /v1/autocomplete/accounts: + get: + tags: + - autocomplete + operationId: getAccountsAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + - in: query + name: date + required: false + schema: + type: string + format: string + example: "2026-10-01" + description: If the account is an asset account or a liability, the autocomplete will also return the balance of the account on this date in the AC title. + - in: query + name: types + description: Optional filter on the account type(s) used in the autocomplete. + required: false + explode: false + schema: + type: array + items: + $ref: '#/components/schemas/AccountTypeFilter' + summary: Returns all accounts of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of accounts with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteAccountArray' + /v1/autocomplete/bills: + get: + tags: + - autocomplete + operationId: getBillsAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all bills of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of bills with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteBillArray' + /v1/autocomplete/budgets: + get: + tags: + - autocomplete + operationId: getBudgetsAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all budgets of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: A list of budgets with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteBudgetArray' + /v1/autocomplete/categories: + get: + tags: + - autocomplete + operationId: getCategoriesAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all categories of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of categories with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteCategoryArray' + /v1/autocomplete/currencies: + get: + tags: + - autocomplete + operationId: getCurrenciesAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all currencies of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: A list of currencies with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteCurrencyArray' + /v1/autocomplete/object-groups: + get: + tags: + - autocomplete + operationId: getObjectGroupsAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all object groups of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: A list of object groups with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteObjectGroupArray' + /v1/autocomplete/piggy-banks: + get: + tags: + - autocomplete + operationId: getPiggiesAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all piggy banks of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: A list of piggy banks with basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompletePiggyBalanceArray' + /v1/autocomplete/recurring: + get: + tags: + - autocomplete + operationId: getRecurringAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all recurring transactions of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: A list of recurring transactions with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteRecurrenceArray' + /v1/autocomplete/rule-groups: + get: + tags: + - autocomplete + operationId: getRuleGroupsAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all rule groups of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: A list of rule groups with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteRuleGroupArray' + /v1/autocomplete/rules: + get: + tags: + - autocomplete + operationId: getRulesAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all rules of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: A list of rules with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteRuleArray' + /v1/autocomplete/subscriptions: + get: + tags: + - autocomplete + operationId: getSubscriptionsAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all subscriptions of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of subscriptions with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteBillArray' + /v1/autocomplete/tags: + get: + tags: + - autocomplete + operationId: getTagAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all tags of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of tags with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteTagArray' + /v1/autocomplete/transaction-types: + get: + tags: + - autocomplete + operationId: getTransactionTypesAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all transaction types returned in a basic auto-complete array. English only. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of transaction types with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteTransactionTypeArray' + /v1/autocomplete/transactions: + get: + tags: + - autocomplete + operationId: getTransactionsAC + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all transaction descriptions of the user returned in a basic auto-complete array. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of transaction descriptions with very basic information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteTransactionArray' + /v1/autocomplete/transactions-with-meta: + get: + tags: + - autocomplete + operationId: getTransactionsWithMeta + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The autocomplete search query. + required: false + schema: + type: string + format: string + example: "string" + - in: query + name: limit + description: The number of items returned. + required: false + schema: + type: integer + format: int32 + example: 10 + summary: Returns all transactions, complemented with meta information. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: Returns all transactions, complemented with meta information. + content: + application/json: + schema: + $ref: '#/components/schemas/AutocompleteTransactionWithMetaArray' + /v1/chart/account/overview: + get: + tags: + - charts + summary: Dashboard chart with asset account balance information. + description: | + This endpoint returns the data required to generate a chart with basic asset account balance information. This is used on the dashboard. + operationId: getChartAccountOverview + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: period + description: | + Optional period to group the data by. If not provided, it will default to '1M' or whatever is deemed relevant for the range provided. + + If you want to know which periods are available, see the enums or get the configuration value: `GET /api/v1/configuration/firefly.valid_view_ranges` + required: false + schema: + type: string + enum: + - 1D + - 1W + - 1M + - 3M + - 6M + - 1Y + example: 1M + - in: query + name: preselected + description: | + Optional set of preselected accounts to limit the chart to. This may be easier than submitting all asset accounts manually, for example. + If you want to know which selection are available, see the enums here or get the configuration value: `GET /api/v1/configuration/firefly.preselected_accounts` + + - `empty`: do not do a pre-selection + - `all`: select all asset and all liability accounts + - `assets`: select all asset accounts + - `liabilities`: select all liability accounts + + If no accounts are found, the user's "frontpage accounts" preference will be used. If that is empty, all asset accounts will be used. + required: false + schema: + type: string + enum: + - empty + - all + - assets + - liabilities + example: all + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: Line chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. + content: + application/json: + schema: + $ref: '#/components/schemas/ChartLine' + /v1/chart/balance/balance: + get: + tags: + - charts + summary: Dashboard chart with balance information. + description: | + This endpoint returns the data required to generate a chart with balance information. + operationId: getChartBalance + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: period + description: | + Optional period to group the data by. If not provided, it will default to '1M' or whatever is deemed relevant for the range provided. + + If you want to know which periods are available, see the enums or get the configuration value: `GET /api/v1/configuration/firefly.valid_view_ranges` + required: false + schema: + type: string + enum: + - 1D + - 1W + - 1M + - 3M + - 6M + - 1Y + example: 1M + - in: query + name: preselected + description: | + Optional set of preselected accounts to limit the chart to. This may be easier than submitting all asset accounts manually, for example. + If you want to know which selection are available, see the enums here or get the configuration value: `GET /api/v1/configuration/firefly.preselected_accounts` + + - `empty`: do not do a pre-selection + - `all`: select all asset and all liability accounts + - `assets`: select all asset accounts + - `liabilities`: select all liability accounts + + If no accounts are found, the user's "frontpage accounts" preference will be used. If that is empty, all asset accounts will be used. + required: false + schema: + type: string + enum: + - empty + - all + - assets + - liabilities + example: all + - in: query + name: accounts[] + description: | + Limit the chart to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. + + This list of accounts will be OVERRULED by the `preselected` parameter. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: Line chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. + content: + application/json: + schema: + $ref: '#/components/schemas/ChartLine' + /v1/chart/budget/overview: + get: + tags: + - charts + summary: Dashboard chart with budget information. + description: | + This endpoint returns the data required to generate a chart with basic budget information. + operationId: getChartBudgetOverview + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: Bar chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. + content: + application/json: + schema: + $ref: '#/components/schemas/ChartLine' + /v1/chart/budget/overview-with-limits: + get: + tags: + - charts + summary: Dashboard chart with budget and budget limit information. + description: | + This endpoint returns the data required to generate a chart with basic budget information, grouped by budget limit when necessary. + operationId: getChartBudgetOverviewWithLimits + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: Bar chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. + content: + application/json: + schema: + $ref: '#/components/schemas/ChartLine' + /v1/chart/category/overview: + get: + tags: + - charts + summary: Dashboard chart with category information. + description: | + This endpoint returns the data required to generate a chart with basic category information. + operationId: getChartCategoryOverview + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: Line chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. + content: + application/json: + schema: + $ref: '#/components/schemas/ChartLine' + /v1/data/bulk/transactions: + post: + summary: Bulk update transaction properties. For more information, see https://docs.firefly-iii.org/references/firefly-iii/api/specials/ + description: | + Allows you to update transactions in bulk. + operationId: bulkUpdateTransactions + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: query + description: The JSON query. + required: true + schema: + type: string + format: json + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "204": + description: Empty response when the update was successful. A future improvement is to include the changed transactions. + /v1/data/destroy: + delete: + tags: + - data + operationId: destroyData + summary: Endpoint to destroy user data + description: | + A call to this endpoint deletes the requested data type. Use it with care and always with user permission. + The demo user is incapable of using this endpoint. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "204": + description: Empty response when data has been destroyed. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: objects + description: The type of data that you wish to destroy. You can only use one at a time. + required: true + schema: + $ref: '#/components/schemas/DataDestroyObject' + - in: query + name: unused + description: | + Only applies when "objects" is set to: not_assets_liabilities, accounts, asset_accounts, expense_accounts, revenue_accounts or liabilities. + + If set to true, only unused accounts will be destroyed. This effectively cleans up the autocomplete dropdowns. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + /v1/data/export/accounts: + get: + summary: Export account data from Firefly III + description: | + This endpoint allows you to export your accounts from Firefly III into a file. Currently supports CSV exports only. + operationId: exportAccounts + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/bills: + get: + summary: Export bills from Firefly III + description: | + This endpoint allows you to export your bills from Firefly III into a file. Currently supports CSV exports only. + operationId: exportBills + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/subscriptions: + get: + summary: Export subscriptions from Firefly III + description: | + This endpoint allows you to export your subscriptions (also known as bills) from Firefly III into a file. Currently supports CSV exports only. + operationId: exportSubscriptions + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/budgets: + get: + summary: Export budgets and budget amount data from Firefly III + description: | + This endpoint allows you to export your budgets and associated budget data from Firefly III into a file. Currently supports CSV exports only. + operationId: exportBudgets + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/categories: + get: + summary: Export category data from Firefly III + description: | + This endpoint allows you to export your categories from Firefly III into a file. Currently supports CSV exports only. + operationId: exportCategories + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/piggy-banks: + get: + summary: Export piggy banks from Firefly III + description: | + This endpoint allows you to export your piggy banks from Firefly III into a file. Currently supports CSV exports only. + operationId: exportPiggies + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/recurring: + get: + summary: Export recurring transaction data from Firefly III + description: | + This endpoint allows you to export your recurring transactions from Firefly III into a file. Currently supports CSV exports only. + operationId: exportRecurring + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/rules: + get: + summary: Export rule groups and rule data from Firefly III + description: | + This endpoint allows you to export your rules and rule groups from Firefly III into a file. Currently supports CSV exports only. + operationId: exportRules + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/tags: + get: + summary: Export tag data from Firefly III + description: | + This endpoint allows you to export your tags from Firefly III into a file. Currently supports CSV exports only. + operationId: exportTags + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/export/transactions: + get: + summary: Export transaction data from Firefly III + description: | + This endpoint allows you to export transactions from Firefly III into a file. Currently supports CSV exports only. + operationId: exportTransactions + tags: + - data + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: accounts + explode: false + description: | + Limit the export of transactions to these accounts only. Only asset accounts will be accepted. Other types will be silently dropped. + required: false + example: "1,2,3" + schema: + type: string + format: string + - in: query + name: type + description: The file type the export file (CSV is currently the only option). + required: false + schema: + $ref: '#/components/schemas/ExportFileFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The exported transaction in a file.' + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/data/purge: + delete: + tags: + - data + operationId: purgeData + summary: Endpoint to purge user data + description: | + A call to this endpoint purges all previously deleted data. Use it with care and always with user permission. + The demo user is incapable of using this endpoint. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "204": + description: Empty response when data has been purged. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + /v1/insight/expense/expense: + get: + summary: Insight into expenses, grouped by expense account. + description: | + This endpoint gives a summary of the expenses made by the user, grouped by expense account. + operationId: insightExpenseExpense + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you add the accounts ID's of expense accounts, only those accounts + are included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. You can combine both asset / liability and expense account ID's. + Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of expense accounts and expense details. Each expense account has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/expense/asset: + get: + summary: Insight into expenses, grouped by asset account. + description: | + This endpoint gives a summary of the expenses made by the user, grouped by asset account. + operationId: insightExpenseAsset + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of asset accounts and expense details. Each asset account has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/income/revenue: + get: + summary: Insight into income, grouped by revenue account. + description: | + This endpoint gives a summary of the income received by the user, grouped by revenue account. + operationId: insightIncomeRevenue + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you add the accounts ID's of revenue accounts, only those accounts + are included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + asset accounts / liabilities will be included. You can combine both asset / liability and deposit account ID's. + Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of revenue accounts and income details. Each revenue account has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/income/asset: + get: + summary: Insight into income, grouped by asset account. + description: | + This endpoint gives a summary of the income received by the user, grouped by asset account. + operationId: insightIncomeAsset + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of asset accounts and income details. Each asset account has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/transfer/asset: + get: + summary: Insight into transfers, grouped by account. + description: | + This endpoint gives a summary of the transfers made by the user, grouped by asset account or lability. + operationId: insightTransfers + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of asset accounts and transfer details. Each asset account has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTransfer' + /v1/insight/expense/bill: + get: + summary: Insight into expenses, grouped by bill. + description: | + This endpoint gives a summary of the expenses made by the user, grouped by (any) bill. + operationId: insightExpenseBill + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: bills[] + description: | + The bills to be included in the results. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of budget and expense details. Each budget has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/expense/no-bill: + get: + summary: Insight into expenses, without bill. + description: | + This endpoint gives a summary of the expenses made by the user, including only expenses with no bill. + operationId: insightExpenseNoBill + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of expense details. One row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/expense/budget: + get: + summary: Insight into expenses, grouped by budget. + description: | + This endpoint gives a summary of the expenses made by the user, grouped by (any) budget. + operationId: insightExpenseBudget + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: budgets[] + description: | + The budgets to be included in the results. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of budget and expense details. Each budget has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/expense/no-budget: + get: + summary: Insight into expenses, without budget. + description: | + This endpoint gives a summary of the expenses made by the user, including only expenses with no budget. + operationId: insightExpenseNoBudget + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of expense details. One row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/expense/category: + get: + summary: Insight into expenses, grouped by category. + description: | + This endpoint gives a summary of the expenses made by the user, grouped by (any) category. + operationId: insightExpenseCategory + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: categories[] + description: | + The categories to be included in the results. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of category and expense details. Each category has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/expense/no-category: + get: + summary: Insight into expenses, without category. + description: | + This endpoint gives a summary of the expenses made by the user, including only expenses with no category. + operationId: insightExpenseNoCategory + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of expense details. One row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/income/category: + get: + summary: Insight into income, grouped by category. + description: | + This endpoint gives a summary of the income received by the user, grouped by (any) category. + operationId: insightIncomeCategory + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: categories[] + description: | + The categories to be included in the results. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of category and income details. Each category has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/income/no-category: + get: + summary: Insight into income, without category. + description: | + This endpoint gives a summary of the income received by the user, including only income with no category. + operationId: insightIncomeNoCategory + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of income details. One row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/transfer/category: + get: + summary: Insight into transfers, grouped by category. + description: | + This endpoint gives a summary of the transfers made by the user, grouped by (any) category. + operationId: insightTransferCategory + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: categories[] + description: | + The categories to be included in the results. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of category and transfer details. Each category has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/transfer/no-category: + get: + summary: Insight into transfers, without category. + description: | + This endpoint gives a summary of the transfers made by the user, including only transfers with no category. + operationId: insightTransferNoCategory + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of transfer details. One row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/expense/tag: + get: + summary: Insight into expenses, grouped by tag. + description: | + This endpoint gives a summary of the expenses made by the user, grouped by (any) tag. + operationId: insightExpenseTag + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: tags[] + description: | + The tags to be included in the results. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of tag and expense details. Each tag has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/expense/no-tag: + get: + summary: Insight into expenses, without tag. + description: | + This endpoint gives a summary of the expenses made by the user, including only expenses with no tag. + operationId: insightExpenseNoTag + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of expense details. One row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/income/tag: + get: + summary: Insight into income, grouped by tag. + description: | + This endpoint gives a summary of the income received by the user, grouped by (any) tag. + operationId: insightIncomeTag + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: tags[] + description: | + The tags to be included in the results. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of tag and income details. Each tag has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/income/no-tag: + get: + summary: Insight into income, without tag. + description: | + This endpoint gives a summary of the income received by the user, including only income with no tag. + operationId: insightIncomeNoTag + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of income details. One row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/transfer/tag: + get: + summary: Insight into transfers, grouped by tag. + description: | + This endpoint gives a summary of the transfers created by the user, grouped by (any) tag. + operationId: insightTransferTag + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: tags[] + description: | + The tags to be included in the results. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of tag and transfer details. Each tag has one row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightGroup' + /v1/insight/transfer/no-tag: + get: + summary: Insight into expenses, without tag. + description: | + This endpoint gives a summary of the transfers made by the user, including only transfers with no tag. + operationId: insightTransferNoTag + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of transfer details. One row per currency.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/expense/total: + get: + summary: Insight into total expenses. + description: | + This endpoint gives a sum of the total expenses made by the user. + operationId: insightExpenseTotal + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'A list of sums in different currencies.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/income/total: + get: + summary: Insight into total income. + description: | + This endpoint gives a sum of the total income received by the user. + operationId: insightIncomeTotal + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of sums in different currencies.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/insight/transfer/total: + get: + summary: Insight into total transfers. + description: | + This endpoint gives a sum of the total amount transfers made by the user. + operationId: insightTransferTotal + tags: + - insight + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + + - in: query + name: accounts[] + description: | + The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + asset accounts / liabilities will be included. Other account ID's will be ignored. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'A list of sums in different currencies.' + content: + application/json: + schema: + $ref: '#/components/schemas/InsightTotal' + /v1/accounts/{id}/transactions: + get: + tags: + - accounts + summary: List all transactions related to the account. + description: | + This endpoint returns a list of all the transactions connected to the account. + operationId: listTransactionByAccount + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the account. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned. + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of transactions + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + /v1/accounts/{id}/attachments: + get: + summary: Lists all attachments. + description: Lists all attachments. + operationId: listAttachmentByAccount + tags: + - accounts + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the account. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of attachments + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + /v1/accounts/{id}/piggy-banks: + get: + tags: + - accounts + summary: List all piggy banks related to the account. + description: | + This endpoint returns a list of all the piggy banks connected to the account. + operationId: listPiggyBankByAccount + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the account. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of piggy banks + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PiggyBankArray' + /v1/accounts: + get: + tags: + - accounts + summary: List all accounts. + description: | + This endpoint returns a list of all the accounts owned by the authenticated user. + operationId: listAccount + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: active + description: Should the endpoint return only active objects or inactive ones? Will be both if not applied. + required: false + schema: + type: boolean + format: boolean + example: true + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. May be omitted. + required: false + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. Must be after "start". Can not be the same as "start". May be omitted. + required: false + schema: + type: string + format: date + + - in: query + name: date + description: | + A date formatted YYYY-MM-DD. When added to the request, Firefly III will show the account's balance on that day. + required: false + schema: + type: string + format: date + - in: query + name: type + description: Optional filter on the account type(s) returned + required: false + schema: + $ref: '#/components/schemas/AccountTypeFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of accounts + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AccountArray' + post: + tags: + - accounts + summary: Create new account. + operationId: storeAccount + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + description: Creates a new account. The data required can be submitted as a JSON body or as a list of parameters (in key=value pairs, like a webform). + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'New account stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AccountSingle' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AccountStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AccountStore' + description: JSON array with the necessary account information or key=value pairs. See the model for the exact specifications. + required: true + /v1/accounts/{id}: + get: + tags: + - accounts + summary: Get single account. + description: | + Returns a single account by its ID. + operationId: getAccount + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. May be omitted. + required: false + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. Must be after "start". Can not be the same as "start". May be omitted. + required: false + schema: + type: string + format: date + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the account. + - in: query + name: date + description: | + A date formatted YYYY-MM-DD. When added to the request, Firefly III will show the account's balance on that day. + required: false + schema: + type: string + format: date + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The requested account' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AccountSingle' + put: + summary: Update existing account. + description: | + Used to update a single account. All fields that are not submitted will be cleared (set to NULL). The model will tell you which fields are mandatory. + operationId: updateAccount + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the account. + tags: + - accounts + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AccountUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AccountUpdate' + description: JSON array or form-data with updated account information. See the model for the exact specifications. + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'Updated account stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AccountSingle' + delete: + summary: Permanently delete account. + description: | + Will permanently delete an account. Any associated transactions and piggy banks are ALSO deleted. Cannot be recovered from. + operationId: deleteAccount + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the account. + tags: + - accounts + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "204": + description: Account deleted + /v1/attachments: + get: + summary: List all attachments. + description: | + This endpoint lists all attachments. + operationId: listAttachment + tags: + - attachments + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of attachments. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + post: + summary: Store a new attachment. + description: | + Creates a new attachment. The data required can be submitted as a JSON body or as a list of parameters. You cannot use this endpoint to upload the actual file data (see below). This endpoint only creates the attachment object. + operationId: storeAttachment + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - attachments + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AttachmentStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AttachmentStore' + description: "JSON array or key=value pairs with the necessary attachment information. See the model for the exact specifications." + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'New attachment stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + /v1/attachments/{id}: + get: + summary: Get a single attachment. + description: | + Get a single attachment. This endpoint only returns the available metadata for the attachment. Actual file data is handled in two other endpoints (see below). + operationId: getAttachment + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the attachment. + tags: + - attachments + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The requested attachment' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentSingle' + put: + operationId: updateAttachment + tags: + - attachments + summary: Update existing attachment. + description: | + Update the meta data for an existing attachment. This endpoint does not allow you to upload or download data. For that, see below. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the attachment. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AttachmentUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AttachmentUpdate' + description: JSON array with updated attachment information. See the model for the exact specifications. + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'Updated attachment stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + delete: + operationId: deleteAttachment + summary: Delete an attachment. + description: | + With this endpoint you delete an attachment, including any stored file data. + tags: + - attachments + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the single attachment. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "204": + description: Attachment deleted. + /v1/attachments/{id}/download: + get: + summary: Download a single attachment. + description: | + This endpoint allows you to download the binary content of a transaction. It will be sent to you as a download, using the content type "application/octet-stream" and content disposition "attachment; filename=example.pdf". + operationId: downloadAttachment + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the attachment. + tags: + - attachments + responses: + "200": + description: "The requested attachment" + content: + application/octet-stream: + schema: + type: string + format: binary + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/attachments/{id}/upload: + post: + summary: Upload an attachment. + description: | + Use this endpoint to upload (and possible overwrite) the file contents of an attachment. Simply put the entire file in the body as binary data. + operationId: uploadAttachment + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the attachment. + tags: + - attachments + responses: + "204": + description: 'Upload was a success' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + requestBody: + content: + application/octet-stream: + schema: + type: string + format: binary + /v1/available-budgets: + get: + summary: List all available budget amounts. + description: | + Firefly III calculates the total amount of money budgeted in so-called "available budgets". This endpoint returns all of these amounts and the periods for which they are calculated. + operationId: listAvailableBudgets + tags: + - available_budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-31" + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of available budget amounts. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AvailableBudgetArray' + /v1/available-budgets/{id}: + get: + summary: Get a single available budget. + description: Get a single available budget, by ID. + operationId: getAvailableBudget + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the available budget. + tags: + - available_budgets + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The requested available budget' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AvailableBudgetSingle' + /v1/bills/{id}/attachments: + get: + summary: List all attachments uploaded to the bill. + description: This endpoint will list all attachments linked to the bill. + operationId: listAttachmentByBill + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the bill. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of attachments + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + /v1/bills/{id}/rules: + get: + summary: List all rules associated with the bill. + description: This endpoint will list all rules that have an action to set the bill to this bill. + operationId: listRuleByBill + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the bill. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of rules + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleArray' + /v1/bills/{id}/transactions: + get: + summary: List all transactions associated with the bill. + description: This endpoint will list all transactions linked to this bill. + operationId: listTransactionByBill + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the bill. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of transactions + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + /v1/bills: + get: + summary: List all bills. + description: This endpoint will list all the user's bills. + operationId: listBill + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. If it is are added to the request, Firefly III will calculate the appropriate payment and paid dates. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. If it is added to the request, Firefly III will calculate the appropriate payment and paid dates. + required: false + schema: + type: string + format: date + example: "2026-10-01" + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of bills + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillArray' + post: + summary: Store a new bill + description: Creates a new bill. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeBill + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - bills + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BillStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BillStore' + description: "JSON array or key=value pairs with the necessary bill information. See the model for the exact specifications." + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'New bill stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + /v1/bills/{id}: + get: + summary: Get a single bill. + description: Get a single bill. + operationId: getBill + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the bill. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. If it is are added to the request, Firefly III will calculate the appropriate payment and paid dates. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. If it is added to the request, Firefly III will calculate the appropriate payment and paid dates. + required: false + schema: + type: string + format: date + example: "2026-10-31" + tags: + - bills + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The requested bill' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillSingle' + put: + operationId: updateBill + tags: + - bills + description: Update existing bill. + summary: Update existing bill. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the bill. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BillUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BillUpdate' + description: JSON array or key=value pairs with updated bill information. See the model for the exact specifications. + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'Updated bill stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + delete: + operationId: deleteBill + description: Delete a bill. This will not delete any associated rules. Will not remove associated transactions. WILL remove all associated attachments. + summary: Delete a bill. + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the bill. + responses: + "204": + description: Bill deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budgets/{id}/limits/{limitId}/transactions: + get: + summary: List all transactions by a budget limit ID. + description: List all the transactions within one budget limit. The start and end date are dictated by the budget limit. + operationId: listTransactionByBudgetLimit + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. The budget limit MUST be associated to the budget ID. + - in: path + name: limitId + required: true + schema: + type: string + example: "123" + description: The ID of the budget limit. The budget limit MUST be associated to the budget ID. + - in: query + name: type + description: Optional filter on the transaction type(s) returned + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "200": + description: A list of transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budgets/{id}/limits: + get: + operationId: listBudgetLimitByBudget + description: | + Get all budget limits for this budget and the money spent, and money left. You can limit the list by submitting a date range as well. The "spent" array for each budget limit is NOT influenced by the start and end date of your query, but by the start and end date of the budget limit itself. + summary: Get all limits for a budget. + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the requested budget. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-31" + responses: + "200": + description: A list of budget limits applicable to this budget. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetLimitArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + operationId: storeBudgetLimit + description: Store a new budget limit under this budget. + summary: Store new budget limit. + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BudgetLimitStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BudgetLimitStore' + description: "JSON array or key=value pairs with the necessary budget information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New budget limit stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetLimitSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budgets/{id}/limits/{limitId}: + get: + summary: Get single budget limit. + operationId: getBudgetLimit + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. The budget limit MUST be associated to the budget ID. + - in: path + name: limitId + required: true + schema: + type: integer + minimum: 1 + example: 1 + description: The ID of the budget limit. The budget limit MUST be associated to the budget ID. + responses: + "200": + description: 'The requested budget limit' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetLimitSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateBudgetLimit + tags: + - budgets + description: Update existing budget limit. + summary: Update existing budget limit. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. The budget limit MUST be associated to the budget ID. + - in: path + name: limitId + required: true + schema: + type: string + example: "123" + description: The ID of the budget limit. The budget limit MUST be associated to the budget ID. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BudgetLimitUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BudgetLimitUpdate' + description: JSON array with updated budget limit information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated budget limit stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetLimitSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteBudgetLimit + description: Delete a budget limit. + summary: Delete a budget limit. + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. The budget limit MUST be associated to the budget ID. + - in: path + name: limitId + required: true + schema: + type: string + example: "123" + description: The ID of the budget limit. The budget limit MUST be associated to the budget ID. + responses: + "204": + description: Budget limit deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budget-limits: + get: + operationId: listBudgetLimit + summary: Get list of budget limits by date + description: | + Get all budget limits for for this date range. + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + example: "2026-10-31" + responses: + "200": + description: A list of budget limits. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetLimitArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budgets/{id}/transactions: + get: + summary: All transactions to a budget. + description: Get all transactions linked to a budget, possibly limited by start and end + operationId: listTransactionByBudget + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "200": + description: A list of transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budgets/{id}/attachments: + get: + summary: Lists all attachments of a budget. + description: Lists all attachments. + operationId: listAttachmentByBudget + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. + responses: + "200": + description: A list of attachments + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budgets/transactions-without-budget: + get: + summary: All transactions without a budget. + description: Get all transactions NOT linked to a budget, possibly limited by start and end + operationId: listTransactionWithoutBudget + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-31" + responses: + "200": + description: A list of transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budgets: + get: + summary: List all budgets. + description: List all the budgets the user has made. If the start date and end date are submitted as well, the "spent" array will be updated accordingly. + operationId: listBudget + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to get info on how much the user has spent. You must submit both start and end. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to get info on how much the user has spent. You must submit both start and end. + required: false + schema: + type: string + format: date + example: "2026-10-31" + responses: + "200": + description: A list of budgets. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new budget + description: Creates a new budget. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeBudget + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - budgets + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BudgetStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BudgetStore' + description: "JSON array or key=value pairs with the necessary budget information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New budget stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/budgets/{id}: + get: + summary: Get a single budget. + description: Get a single budget. If the start date and end date are submitted as well, the "spent" array will be updated accordingly. + operationId: getBudget + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the requested budget. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to get info on how much the user has spent. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to get info on how much the user has spent. + required: false + schema: + type: string + format: date + example: "2026-10-31" + tags: + - budgets + responses: + "200": + description: 'The requested budget' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateBudget + tags: + - budgets + description: Update existing budget. This endpoint cannot be used to set budget amount limits. + summary: Update existing budget. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BudgetUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BudgetUpdate' + description: JSON array with updated budget information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated budget stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteBudget + description: Delete a budget. Transactions will not be deleted. + summary: Delete a budget. + tags: + - budgets + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the budget. + responses: + "204": + description: Budget deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/categories/{id}/transactions: + get: + summary: List all transactions in a category. + description: List all transactions in a category, optionally limited to the date ranges specified. + operationId: listTransactionByCategory + tags: + - categories + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the category. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to limit the result list. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to limit the result list. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "200": + description: A list of transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/categories/{id}/attachments: + get: + summary: Lists all attachments. + description: Lists all attachments. + operationId: listAttachmentByCategory + tags: + - categories + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the category. + + responses: + "200": + description: A list of attachments + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/categories: + get: + summary: List all categories. + description: List all categories. + operationId: listCategory + tags: + - categories + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of categories. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CategoryArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new category + description: Creates a new category. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeCategory + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - categories + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CategoryStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CategoryStore' + description: "JSON array or key=value pairs with the necessary category information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New category stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CategorySingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/categories/{id}: + get: + summary: Get a single category. + description: Get a single category. + operationId: getCategory + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the category. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to show spent and earned info. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to show spent and earned info. + required: false + schema: + type: string + format: date + example: "2026-10-31" + tags: + - categories + responses: + "200": + description: 'The requested category' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CategorySingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateCategory + tags: + - categories + description: Update existing category. + summary: Update existing category. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the category. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CategoryUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CategoryUpdate' + description: JSON array with updated category information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated category stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CategorySingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteCategory + description: Delete a category. Transactions will not be removed. + summary: Delete a category. + tags: + - categories + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the category. + responses: + "204": + description: Category deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/exchange-rates: + get: + summary: List all exchange rates that Firefly III knows. + description: List exchange rates that Firefly III knows. + operationId: listCurrencyExchangeRates + tags: + - currency_exchange_rates + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of all available currency exchange rates. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new currency exchange rate. + description: Stores a new exchange rate. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeCurrencyExchangeRate + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - currency_exchange_rates + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateStore' + description: "JSON array or key=value pairs with the necessary exchange rate information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New exchange stored, result in response. If a rate already exists for this currency pair and date, it will be updated.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/exchange-rates/{id}: + get: + summary: List a single specific exchange rate. + description: List a single specific exchange rate by its ID. + operationId: listSpecificCurrencyExchangeRate + tags: + - currency_exchange_rates + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the requested currency exchange rate. + responses: + "200": + description: The exchange rate requested. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteSpecificCurrencyExchangeRate + description: "Delete a specific currency exchange rate by its internal ID." + summary: "Delete a specific currency exchange rate." + tags: + - currency_exchange_rates + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the requested currency exchange rate. + responses: + "204": + description: "Currency exchange rate deleted." + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + summary: Update existing currency exchange rate. + description: | + Used to update a single currency exchange rate by its ID. Including the from/to currency is optional. + operationId: updateCurrencyExchangeRate + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the currency exchange rate. + tags: + - currency_exchange_rates + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateUpdate' + description: JSON array or form-data with updated exchange rate information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated exchange rate stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + + /v1/exchange-rates/{from}/{to}: + get: + summary: List all exchange rates from/to the mentioned currencies. + description: List all exchange rates from/to the mentioned currencies. + operationId: listSpecificCurrencyExchangeRates + tags: + - currency_exchange_rates + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: from + required: true + schema: + type: string + example: "EUR" + description: "The currency code of the 'from' currency." + - in: path + name: to + required: true + schema: + type: string + example: "USD" + description: "The currency code of the 'to' currency." + responses: + "200": + description: A list of currency exchange rates. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteSpecificCurrencyExchangeRates + summary: "Deletes ALL currency exchange rates from 'from' to 'to'." + description: "Deletes ALL currency exchange rates from 'from' to 'to'. It's important to know that the reverse exchange rates (from 'to' to 'from') will not be deleted and Firefly III will still be able to infer the correct exchange rate from the reverse one." + tags: + - currency_exchange_rates + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: from + required: true + schema: + type: string + example: "EUR" + description: "The currency code of the 'from' currency." + - in: path + name: to + required: true + schema: + type: string + example: "USD" + description: "The currency code of the 'to' currency." + responses: + "204": + description: "Currency exchange rate(s) deleted." + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/exchange-rates/{from}/{to}/{date}: + get: + summary: List the exchange rate for the from and to-currency on the requested date. + description: List the exchange rate for the from and to-currency on the requested date. + operationId: listSpecificCurrencyExchangeRateOnDate + tags: + - currency_exchange_rates + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: from + required: true + schema: + type: string + example: "EUR" + description: "The currency code of the 'from' currency." + - in: path + name: to + required: true + schema: + type: string + example: "USD" + description: "The currency code of the 'to' currency." + - in: path + name: date + required: true + schema: + type: string + format: string + example: "2026-10-01" + responses: + "200": + description: A list of currency exchange rates. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteSpecificCurrencyExchangeRateOnDate + description: "Delete the currency exchange rate from 'from' to 'to' on the specified date. It's important to know that the reverse exchange rate (from 'to' to 'from') will not be deleted and Firefly III will still be able to infer the correct exchange rate from the reverse one." + summary: "Delete the currency exchange rate from 'from' to 'to' on the specified date." + tags: + - currency_exchange_rates + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: from + required: true + schema: + type: string + example: "EUR" + description: "The currency code of the 'from' currency." + - in: path + name: to + required: true + schema: + type: string + example: "USD" + description: "The currency code of the 'to' currency." + - in: path + name: date + required: true + schema: + type: string + format: string + example: "2026-10-01" + responses: + "204": + description: "Currency exchange rate(s) deleted." + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + summary: Update existing currency exchange rate. + description: | + Used to update a single currency exchange rate by its currency codes and date + operationId: updateCurrencyExchangeRateByDate + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: from + required: true + schema: + type: string + example: "EUR" + description: "The currency code of the 'from' currency." + - in: path + name: to + required: true + schema: + type: string + example: "USD" + description: "The currency code of the 'to' currency." + - in: path + name: date + required: true + schema: + type: string + format: string + example: "2026-10-01" + tags: + - currency_exchange_rates + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateUpdateNoDate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateUpdate' + description: JSON array or form-data with updated exchange rate information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated exchange rate stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + /v1/exchange-rates/by-date/{date}: + post: + summary: Store new currency exchange rates under this date + description: Stores a new set of exchange rates. The date is fixed (in the URL parameter) and the data required can be submitted as a JSON body. + operationId: storeCurrencyExchangeRatesByDate + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: date + required: true + schema: + type: string + format: string + example: "2026-10-01" + tags: + - currency_exchange_rates + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateStoreByDate' + description: "JSON array with the necessary currency exchange rate information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New exchange rates stored, result in response. If a rate already existed for any submitted entry, it will be updated.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateArray' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/exchange-rates/by-currencies/{from}/{to}: + post: + summary: Store new currency exchange rates under this from/to pair. + description: Stores a new set of exchange rates for this pair. The date is variable, and the data required can be submitted as a JSON body. + operationId: storeCurrencyExchangeRatesByPair + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: from + required: true + schema: + type: string + example: "EUR" + description: "The currency code of the 'from' currency." + - in: path + name: to + required: true + schema: + type: string + example: "USD" + description: "The currency code of the 'to' currency." + tags: + - currency_exchange_rates + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateStoreByPair' + description: "JSON array with the necessary currency exchange rate information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New exchange rates stored, result in response. If a rate already existed for any submitted entry, it will be updated.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateArray' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/link-types/{id}/transactions: + get: + tags: + - links + summary: List all transactions under this link type. + description: | + List all transactions under this link type, both the inward and outward transactions. + operationId: listTransactionByLinkType + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the link type. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to limit the results. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to limit the results. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned. + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "200": + description: A list of transactions + content: + application/json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/link-types: + get: + tags: + - links + summary: List all types of links. + description: | + List all the link types the system has. These include the default ones as well as any new ones. + operationId: listLinkType + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of link types. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/LinkTypeArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + tags: + - links + summary: Create a new link type + operationId: storeLinkType + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + description: Creates a new link type. The data required can be submitted as a JSON body or as a list of parameters (in key=value pairs, like a webform). + responses: + "200": + description: 'New link type stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/LinkTypeSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LinkType' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LinkType' + description: JSON array with the necessary link type information or key=value pairs. See the model for the exact specifications. + required: true + /v1/link-types/{id}: + get: + tags: + - links + summary: Get single a link type. + description: | + Returns a single link type by its ID. + operationId: getLinkType + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the link type. + responses: + "200": + description: 'The requested link type' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/LinkTypeSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + summary: Update existing link type. + description: | + Used to update a single link type. All fields that are not submitted will be cleared (set to NULL). The model will tell you which fields are mandatory. You cannot update some of the system provided link types, indicated by the editable=false flag when you list it. + operationId: updateLinkType + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the link type. + tags: + - links + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LinkTypeUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/LinkTypeUpdate' + description: JSON array or form-data with updated link type information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated link type stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/LinkTypeSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + summary: Permanently delete link type. + description: | + Will permanently delete a link type. The links between transactions will be removed. The transactions themselves remain. You cannot delete some of the system provided link types, indicated by the editable=false flag when you list it. + operationId: deleteLinkType + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the link type. + tags: + - links + responses: + "204": + description: Link type deleted + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/transaction-links: + get: + tags: + - links + summary: List all transaction links. + description: | + List all the transaction links. + operationId: listTransactionLink + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of transaction links + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionLinkArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + tags: + - links + summary: Create a new link between transactions + operationId: storeTransactionLink + description: Store a new link between two transactions. For this end point you need the journal_id from a transaction. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + responses: + "200": + description: 'New transaction link stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionLinkSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TransactionLinkStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TransactionLinkStore' + description: JSON array with the necessary link type information or key=value pairs. See the model for the exact specifications. + required: true + /v1/transaction-links/{id}: + get: + tags: + - links + summary: Get a single link. + description: | + Returns a single link by its ID. + operationId: getTransactionLink + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction link. + responses: + "200": + description: 'The requested link' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionLinkSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + summary: Permanently delete link between transactions. + description: | + Will permanently delete link. Transactions remain. + operationId: deleteTransactionLink + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction link. + tags: + - links + responses: + "204": + description: Transaction link deleted + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + summary: Update an existing link between transactions. + description: | + Used to update a single existing link. + operationId: updateTransactionLink + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction link. + tags: + - links + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TransactionLinkUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TransactionLinkUpdate' + description: JSON array or form-data with updated link type information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated link type stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionLinkSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/object-groups/{id}/piggy-banks: + get: + tags: + - object_groups + summary: List all piggy banks related to the object group. + description: | + This endpoint returns a list of all the piggy banks connected to the object group. + operationId: listPiggyBankByObjectGroup + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the account. + + responses: + "200": + description: A list of piggy banks + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PiggyBankArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/object-groups/{id}/bills: + get: + summary: List all bills with this object group. + description: List all bills with this object group. + operationId: listBillByObjectGroup + tags: + - object_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the account. + responses: + "200": + description: A list of bills. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/object-groups: + get: + summary: List all object groups. + description: List all object groups. + operationId: listObjectGroups + tags: + - object_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of object groups + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/ObjectGroupArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/object-groups/{id}: + get: + summary: Get a single object group. + description: Get a single object group. + operationId: getObjectGroup + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the object group. + tags: + - object_groups + responses: + "200": + description: The requested object group + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/ObjectGroupSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateObjectGroup + tags: + - object_groups + description: Update existing object group. + summary: Update existing object group. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the object group + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectGroupUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ObjectGroupUpdate' + description: JSON array with updated piggy bank information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated object group stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/ObjectGroupSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteObjectGroup + description: Delete a object group. + summary: Delete a object group. + tags: + - object_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the object group. + responses: + "204": + description: Object group deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/piggy-banks/{id}/events: + get: + summary: List all events linked to a piggy bank. + description: List all events linked to a piggy bank (adding and removing money). + operationId: listEventByPiggyBank + tags: + - piggy_banks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the piggy bank + + responses: + "200": + description: A list of piggy bank related events + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PiggyBankEventArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/piggy-banks/{id}/attachments: + get: + summary: Lists all attachments. + description: Lists all attachments. + operationId: listAttachmentByPiggyBank + tags: + - piggy_banks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the piggy bank. + + responses: + "200": + description: A list of attachments + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/piggy-banks/{id}/accounts: + get: + summary: List all accounts linked to a piggy bank. + description: List all accounts linked to a piggy bank. A piggy bank can be linked to multiple accounts. + operationId: listAccountByPiggyBank + tags: + - piggy_banks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the piggy bank. + responses: + "200": + description: A list of accounts + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AccountArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/piggy-banks: + get: + summary: List all piggy banks. + description: List all piggy banks. + operationId: listPiggyBank + tags: + - piggy_banks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + + responses: + "200": + description: A list of piggy banks + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PiggyBankArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new piggy bank + description: Creates a new piggy bank. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storePiggyBank + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - piggy_banks + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PiggyBankStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PiggyBankStore' + description: "JSON array or key=value pairs with the necessary piggy bank information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New piggy bank stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PiggyBankSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/piggy-banks/{id}: + get: + summary: Get a single piggy bank. + description: Get a single piggy bank. + operationId: getPiggyBank + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the piggy bank. + tags: + - piggy_banks + responses: + "200": + description: 'The requested piggy bank' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PiggyBankSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updatePiggyBank + tags: + - piggy_banks + description: Update existing piggy bank. + summary: Update existing piggy bank. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the piggy bank + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PiggyBankUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PiggyBankUpdate' + description: JSON array with updated piggy bank information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated piggy bank stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PiggyBankSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deletePiggyBank + description: Delete a piggy bank. + summary: Delete a piggy bank. + tags: + - piggy_banks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the piggy bank. + responses: + "204": + description: Piggy bank deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/recurrences/{id}/transactions: + get: + summary: List all transactions created by a recurring transaction. + description: List all transactions created by a recurring transaction, optionally limited to the date ranges specified. + operationId: listTransactionByRecurrence + tags: + - recurrences + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the recurring transaction. + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. Both the start and end date must be present. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. Both the start and end date must be present. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "200": + description: A list of transactions + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/recurrences: + get: + summary: List all recurring transactions. + description: List all recurring transactions. + operationId: listRecurrence + tags: + - recurrences + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of recurring transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RecurrenceArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new recurring transaction + description: Creates a new recurring transaction. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeRecurrence + tags: + - recurrences + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecurrenceStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RecurrenceStore' + description: "JSON array or key=value pairs with the necessary recurring transaction information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New recurring transaction stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RecurrenceSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/recurrences/{id}: + get: + summary: Get a single recurring transaction. + description: Get a single recurring transaction. + operationId: getRecurrence + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the recurring transaction. + tags: + - recurrences + responses: + "200": + description: 'The requested recurring transaction' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RecurrenceSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateRecurrence + tags: + - recurrences + description: Update existing recurring transaction. + summary: Update existing recurring transaction. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the recurring transaction. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecurrenceUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RecurrenceUpdate' + description: JSON array with updated recurring transaction information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated recurring transaction stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RecurrenceSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteRecurrence + description: Delete a recurring transaction. Transactions created by the recurring transaction will not be deleted. + summary: Delete a recurring transaction. + tags: + - recurrences + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the recurring transaction. + responses: + "204": + description: Recurring transaction deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/recurrences/{id}/trigger: + post: + summary: Trigger the creation of a transaction for a specific recurring transaction + description: | + Trigger the creation of a transaction for a specific recurring transaction. All recurrences have a set of future occurrences. For those moments, you can trigger the creation of the transaction. That means the transaction will be created NOW, instead of on the indicated date. The transaction will be dated to _today_. + + So, if you recurring transaction that occurs every Monday, you can trigger the creation of a transaction for Monday in two weeks, today. On that Monday two weeks from now, no transaction will be created. Instead, the transaction is created right now, and dated _today_. + operationId: triggerRecurrenceRecurrence + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the recurring transaction. + - in: query + name: date + description: | + A date formatted YYYY-MM-DD. This is the date for which you want the recurrence to fire. You can take the date from the list of occurrences in the recurring transaction. + required: true + schema: + type: string + format: date + tags: + - recurrences + responses: + "200": + description: 'A list of transactions (always just 1) created by the recurrence, or a list of zero (0) when there is nothing to create for this date.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rule-groups/{id}/rules: + get: + summary: List rules in this rule group. + description: List rules in this rule group. + operationId: listRuleByGroup + tags: + - rule_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule group. + + responses: + "200": + description: A list of rules. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rule-groups/{id}/test: + get: + summary: Test which transactions would be hit by the rule group. No changes will be made. + description: Test which transactions would be hit by the rule group. No changes will be made. Limit the result if you want to. + operationId: testRuleGroup + tags: + - rule_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule group. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to limit the transactions the test will be applied to. Both the start date and the end date must be present. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to limit the transactions the test will be applied to. Both the start date and the end date must be present. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: search_limit + description: | + Maximum number of transactions Firefly III will try. Don't set this too high, or it will take Firefly III very long to run the test. I suggest a max of 200. + required: false + schema: + type: integer + - in: query + name: triggered_limit + description: | + Maximum number of transactions the rule group can actually trigger on, before Firefly III stops. I would suggest setting this to 10 or 15. Don't go above the user's page size, because browsing to page 2 or 3 of a test result would fire the test again, making any navigation efforts very slow. + required: false + schema: + type: integer + - in: query + name: accounts[] + description: | + Limit the testing of the rule group to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "200": + description: A list of transactions that would be changed by any of the rules of the rule group. No changes will be made. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rule-groups/{id}/trigger: + post: + summary: Fire the rule group on your transactions. + description: Fire the rule group on your transactions. Changes will be made by the rules in the rule group. Limit the result if you want to. + operationId: fireRuleGroup + tags: + - rule_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule group. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to limit the transactions the actions will be applied to. Both the start date and the end date must be present. + required: false + schema: + type: string + example: "2026-10-01" + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to limit the transactions the actions will be applied to. Both the start date and the end date must be present. + required: false + schema: + type: string + example: "2026-10-31" + format: date + - in: query + name: accounts[] + description: | + Limit the triggering of the rule group to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "204": + description: "The rules in the group are executed. Due to the setup of this function (asynchronous job execution) the result cannot be displayed." + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rule-groups: + get: + summary: List all rule groups. + description: List all rule groups. + operationId: listRuleGroup + tags: + - rule_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of rule groups. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleGroupArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new rule group. + description: Creates a new rule group. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeRuleGroup + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - rule_groups + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RuleGroupStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RuleGroupStore' + description: "JSON array or key=value pairs with the necessary rule group information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New rule group stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleGroupSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rule-groups/{id}: + get: + summary: Get a single rule group. + description: Get a single rule group. This does not include the rules. For that, see below. + operationId: getRuleGroup + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule group. + tags: + - rule_groups + responses: + "200": + description: 'The requested rule group' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleGroupSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateRuleGroup + tags: + - rule_groups + description: Update existing rule group. + summary: Update existing rule group. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule group. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RuleGroupUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RuleGroupUpdate' + description: JSON array with updated rule group information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated rule group stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleGroupSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteRuleGroup + description: Delete a rule group. + summary: Delete a rule group. + tags: + - rule_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule group. + responses: + "204": + description: Rule group deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rules/{id}/test: + get: + summary: Test which transactions would be hit by the rule. No changes will be made. + description: Test which transactions would be hit by the rule. No changes will be made. Limit the result if you want to. + operationId: testRule + tags: + - rules + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to limit the transactions the test will be applied to. Both the start date and the end date must be present. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to limit the transactions the test will be applied to. Both the start date and the end date must be present. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: accounts[] + description: | + Limit the testing of the rule to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "200": + description: A list of transactions that would be changed by the rule. No changes will be made. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rules/{id}/trigger: + post: + summary: Fire the rule on your transactions. + description: Fire the rule group on your transactions. Changes will be made by the rules in the group. Limit the result if you want to. + operationId: fireRule + tags: + - rules + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to limit the transactions the actions will be applied to. If the start date is not present, it will be set to one year ago. If you use this field, both the start date and the end date must be present. + required: false + schema: + type: string + example: "2026-10-01" + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to limit the transactions the actions will be applied to. If the end date is not present, it will be set to today. If you use this field, both the start date and the end date must be present. + required: false + schema: + type: string + example: "2026-10-31" + format: date + - in: query + name: accounts[] + description: | + Limit the triggering of the rule to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. + required: false + explode: true + schema: + type: array + items: + type: integer + format: int64 + example: [ 1, 2, 3 ] + responses: + "204": + description: "The rules in the group are executed. Due to the setup of this function (asynchronous job execution) the result cannot be displayed." + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rules: + get: + summary: List all rules. + description: List all rules. + operationId: listRule + tags: + - rules + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of rules + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new rule + description: Creates a new rule. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeRule + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - rules + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RuleStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RuleStore' + description: "JSON array or key=value pairs with the necessary rule information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New rule stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rules/{id}: + get: + summary: Get a single rule. + description: Get a single rule. + operationId: getRule + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the object. + tags: + - rules + responses: + "200": + description: 'The requested rule' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateRule + tags: + - rules + description: Update existing rule. + summary: Update existing rule. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the object. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RuleUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RuleUpdate' + description: JSON array with updated rule information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated rule stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteRule + description: Delete an rule. + summary: Delete an rule. + tags: + - rules + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the rule. + responses: + "204": + description: Rule deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/rules/validate-expression: + get: + summary: Validate an action expression. + description: | + Validate an action expression as used in rule actions. Returns whether the submitted expression is valid. + If the expression is invalid, a 422 validation error is returned instead. + operationId: validateActionExpression + tags: + - rules + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: expression + description: The action expression to validate. + required: true + schema: + type: string + example: "{{ description | upper }}" + responses: + "200": + description: The expression is valid. + content: + application/json: + schema: + type: object + properties: + valid: + type: boolean + example: true + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/subscriptions/{id}/attachments: + get: + summary: List all attachments uploaded to the subscription. + description: This endpoint will list all attachments linked to the subscription (also known as a bill). + operationId: listAttachmentBySubscription + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the subscription. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of attachments + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + /v1/subscriptions/{id}/rules: + get: + summary: List all rules associated with the subscription. + description: This endpoint will list all rules that have an action to set the subscription (bill) to this subscription. + operationId: listRuleBySubscription + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the subscription. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of rules + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleArray' + /v1/subscriptions/{id}/transactions: + get: + summary: List all transactions associated with the subscription. + description: This endpoint will list all transactions linked to this subscription (also known as a bill). + operationId: listTransactionBySubscription + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the subscription. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of transactions + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + /v1/subscriptions: + get: + summary: List all subscriptions. + description: This endpoint will list all the user's subscriptions. Subscriptions are also known as bills, and this endpoint is an alias of `/bills`. + operationId: listSubscription + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. If it is are added to the request, Firefly III will calculate the appropriate payment and paid dates. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. If it is added to the request, Firefly III will calculate the appropriate payment and paid dates. + required: false + schema: + type: string + format: date + example: "2026-10-01" + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: A list of subscriptions + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillArray' + post: + summary: Store a new subscription + description: Creates a new subscription. The data required can be submitted as a JSON body or as a list of parameters. Subscriptions are also known as bills. + operationId: storeSubscription + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - bills + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BillStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BillStore' + description: "JSON array or key=value pairs with the necessary subscription information. See the model for the exact specifications." + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'New subscription stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + /v1/subscriptions/{id}: + get: + summary: Get a single subscription. + description: Get a single subscription. Subscriptions are also known as bills. + operationId: getSubscription + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the subscription. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. If it is are added to the request, Firefly III will calculate the appropriate payment and paid dates. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. If it is added to the request, Firefly III will calculate the appropriate payment and paid dates. + required: false + schema: + type: string + format: date + example: "2026-10-31" + tags: + - bills + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The requested subscription' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillSingle' + put: + operationId: updateSubscription + tags: + - bills + description: Update existing subscription. + summary: Update existing subscription. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the subscription. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BillUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/BillUpdate' + description: JSON array or key=value pairs with updated subscription information. See the model for the exact specifications. + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'Updated subscription stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + delete: + operationId: deleteSubscription + description: Delete a subscription. This will not delete any associated rules. Will not remove associated transactions. WILL remove all associated attachments. + summary: Delete a subscription. + tags: + - bills + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the subscription. + responses: + "204": + description: Subscription deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/tags/{tag}/attachments: + get: + summary: Lists all attachments. + description: Lists all attachments. + operationId: listAttachmentByTag + tags: + - tags + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: tag + description: Either the tag itself or the tag ID. + required: true + schema: + type: string + format: string + example: groceries + + responses: + "200": + description: A list of attachments + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/tags/{tag}/transactions: + get: + summary: "List all transactions with this tag." + description: "List all transactions with this tag." + operationId: listTransactionByTag + tags: + - tags + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: tag + description: Either the tag itself or the tag ID. + required: true + schema: + type: string + format: string + example: groceries + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. This is the start date of the selected range (inclusive). + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. This is the end date of the selected range (inclusive). + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned. + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "200": + description: A list of transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/tags: + get: + summary: List all tags. + description: List all of the user's tags. + operationId: listTag + tags: + - tags + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + + responses: + "200": + description: A list of tags + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TagArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new tag + description: Creates a new tag. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeTag + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - tags + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TagModelStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TagModelStore' + description: "JSON array or key=value pairs with the necessary tag information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New tag stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TagSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/tags/{tag}: + get: + summary: Get a single tag. + description: Get a single tag. + operationId: getTag + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: tag + description: Either the tag itself or the tag ID. If you use the tag itself, and it contains international (non-ASCII) characters, your mileage may vary. + required: true + schema: + type: string + format: string + example: groceries + tags: + - tags + responses: + "200": + description: 'The requested tag' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TagSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateTag + tags: + - tags + description: Update existing tag. + summary: Update existing tag. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: tag + description: Either the tag itself or the tag ID. If you use the tag itself, and it contains international (non-ASCII) characters, your mileage may vary. + required: true + schema: + type: string + format: string + example: groceries + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TagModelUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TagModelUpdate' + description: JSON array with updated tag information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated tag stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TagSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteTag + description: Delete an tag. + summary: Delete an tag. + tags: + - tags + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: tag + description: Either the tag itself or the tag ID. If you use the tag itself, and it contains international (non-ASCII) characters, your mileage may vary. + required: true + schema: + type: string + format: string + example: groceries + responses: + "204": + description: Tag deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/accounts: + get: + summary: List all accounts with this currency. + description: List all accounts with this currency. + operationId: listAccountByCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + - in: query + name: date + description: | + A date formatted YYYY-MM-DD. When added to the request, Firefly III will show the account's balance on that day. + required: false + schema: + type: string + format: date + - in: query + name: type + description: Optional filter on the account type(s) returned + required: false + schema: + $ref: '#/components/schemas/AccountTypeFilter' + responses: + "200": + description: A list of accounts + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AccountArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/available-budgets: + get: + summary: List all available budgets with this currency. + description: List all available budgets with this currency. + operationId: listAvailableBudgetByCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: EUR + description: The currency code. + + responses: + "200": + description: A list of available budgets + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AvailableBudgetArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/bills: + get: + summary: List all bills with this currency. + description: List all bills with this currency. + operationId: listBillByCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + + responses: + "200": + description: A list of bills. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BillArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/budget-limits: + get: + summary: List all budget limits with this currency + description: List all budget limits with this currency + operationId: listBudgetLimitByCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + - in: query + name: start + description: Start date for the budget limit list. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: End date for the budget limit list. + required: false + schema: + type: string + format: date + example: "2026-10-31" + responses: + "200": + description: A list of budget limits. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BudgetLimitArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/recurrences: + get: + summary: List all recurring transactions with this currency. + description: List all recurring transactions with this currency. + operationId: listRecurrenceByCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: EUR + description: The currency code. + responses: + "200": + description: A list of recurring transactions + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RecurrenceArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/rules: + get: + summary: List all rules with this currency. + description: List all rules with this currency. + operationId: listRuleByCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + responses: + "200": + description: A list of rules + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/RuleArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/transactions: + get: + summary: List all transactions with this currency. + description: List all transactions with this currency. + operationId: listTransactionByCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + - in: query + name: start + description: | + A date formatted YYYY-MM-DD, to limit the list of transactions. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD, to limit the list of transactions. + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "200": + description: A list of transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/cer: + get: + summary: List all exchange rates for this currency. + description: List all currency exchange rates that have this currency as the source or destination currency. + operationId: listExchangeRatesByCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + responses: + "200": + description: A list of currency exchange rates. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyExchangeRateArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies: + get: + summary: List all currencies. + description: List all currencies. + operationId: listCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of currencies. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new currency + description: Creates a new currency. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeCurrency + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - currencies + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencyStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CurrencyStore' + description: "JSON array or key=value pairs with the necessary currency information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New currency stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencySingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/enable: + post: + summary: Enable a single currency. + description: Enable a single currency. + operationId: enableCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + responses: + "204": + description: Currency was enabled. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencySingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/disable: + post: + summary: Disable a currency. + description: Disable a currency. + operationId: disableCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: code + required: true + schema: + type: string + example: GBP + description: The currency code. + responses: + "204": + description: Currency was disabled. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencySingle' + "409": + description: Currency cannot be disabled, because it is still in use. + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}/primary: + post: + summary: Make currency primary currency. + description: Make this currency the primary currency for the current financial administration. If the currency is not enabled, it will be enabled as well. + operationId: primaryCurrency + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + responses: + "204": + description: Currency has been made the primary currency. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencySingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/{code}: + get: + summary: Get a single currency. + description: Get a single currency. + operationId: getCurrency + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: USD + description: The currency code. + tags: + - currencies + responses: + "200": + description: 'The requested currency' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencySingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateCurrency + tags: + - currencies + description: Update existing currency. + summary: Update existing currency. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: EUR + description: The currency code. + requestBody: + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CurrencyUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CurrencyUpdate' + description: JSON array with updated currency information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated currency stored, result in response' + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencySingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteCurrency + description: Delete a currency. + summary: Delete a currency. + tags: + - currencies + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: code + required: true + schema: + type: string + format: string + example: GBP + description: The currency code. + responses: + "204": + description: Currency deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/primary: + get: + summary: Get the primary currency of the current administration. + description: Get the primary currency of the current administration. This replaces what was called "the user's default currency" although they are essentially the same. + operationId: getPrimaryCurrency + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - currencies + responses: + "200": + description: 'The primary currency' + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencySingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/currencies/default: + get: + summary: Get the default (primary) currency of the current administration. + description: Get the default currency of the current administration. This is an alias of `/currencies/primary`. + operationId: getDefaultCurrency + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - currencies + responses: + "200": + description: 'The default currency' + content: + application/json: + schema: + $ref: '#/components/schemas/CurrencySingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/transaction-journals/{id}/links: + get: + summary: Lists all the transaction links for an individual journal (individual split). + description: Lists all the transaction links for an individual journal (a split). Don't use the group ID, you need the actual underlying journal (the split). + operationId: listLinksByJournal + tags: + - transactions + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction journal / the split. + + responses: + "200": + description: A list of transaction links. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionLinkArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/transaction-journals/{id}: + get: + summary: Get a single transaction, based on one of the underlying transaction journals (transaction splits). + description: Get a single transaction by underlying journal (split). + operationId: getTransactionByJournal + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction journal (split). + tags: + - transactions + responses: + "200": + description: 'The requested transaction.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteTransactionJournal + description: Delete an individual journal (split) from a transaction. + summary: Delete split from transaction + tags: + - transactions + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction journal (the split) you wish to delete. + responses: + "204": + description: Transaction journal (split) deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/transactions/{id}/attachments: + get: + summary: Lists all attachments. + description: Lists all attachments. + operationId: listAttachmentByTransaction + tags: + - transactions + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction. + + responses: + "200": + description: A list of attachments + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AttachmentArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/transactions/{id}/piggy-bank-events: + get: + summary: Lists all piggy bank events. + description: Lists all piggy bank events. + operationId: listEventByTransaction + tags: + - transactions + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction. + + responses: + "200": + description: A list of piggy bank events. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PiggyBankEventArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/transactions: + get: + summary: | + List all the user's transactions. + description: List all the user's transactions. + operationId: listTransaction + tags: + - transactions + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. This is the start date of the selected range (inclusive). + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. This is the end date of the selected range (inclusive). + required: false + schema: + type: string + format: date + example: "2026-10-31" + - in: query + name: type + description: Optional filter on the transaction type(s) returned. + required: false + schema: + $ref: '#/components/schemas/TransactionTypeFilter' + responses: + "200": + description: A list of transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new transaction + description: Creates a new transaction. The data required can be submitted as a JSON body or as a list of parameters. + operationId: storeTransaction + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - transactions + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TransactionStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TransactionStore' + description: "JSON array or key=value pairs with the necessary transaction information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New transaction stored(s), result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/transactions/{id}: + get: + summary: Get a single transaction. + description: Get a single transaction. + operationId: getTransaction + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction. + tags: + - transactions + responses: + "200": + description: 'The requested transaction.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateTransaction + tags: + - transactions + description: Update an existing transaction. + summary: Update existing transaction. For more information, see https://docs.firefly-iii.org/references/firefly-iii/api/specials/ + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TransactionUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TransactionUpdate' + description: JSON array with updated transaction information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated transaction stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteTransaction + description: Delete a transaction. + summary: Delete a transaction. + tags: + - transactions + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the transaction. + responses: + "204": + description: Transaction deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/user-groups: + get: + summary: | + List all the user groups available to this user. + description: "List all the user groups available to this user. These are essentially the 'financial administrations' that Firefly III supports." + operationId: listUserGroups + tags: + - user_groups + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of user groups. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/UserGroupArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/user-groups/{id}: + get: + tags: + - user_groups + summary: Get a single user group. + description: | + Returns a single user group by its ID. + operationId: getUserGroup + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The ID of the user group. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'The requested user group' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/UserGroupSingle' + put: + summary: Update an existing user group. + description: | + Used to update a single user group. The available fields are still limited. + operationId: updateUserGroup + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "1" + description: The ID of the account. + tags: + - user_groups + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserGroupUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/UserGroupUpdate' + description: JSON array or form-data with new user group information. See the model for the exact specifications. + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "200": + description: 'Updated user group is stored, result is in the response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/UserGroupSingle' + /v1/search/accounts: + get: + summary: Search for accounts + description: Search for accounts + operationId: searchAccounts + tags: + - search + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: query + description: The query you wish to search for. + required: true + schema: + type: string + example: "checking" + - in: query + name: type + description: The type of accounts you wish to limit the search to. + required: false + schema: + $ref: '#/components/schemas/AccountTypeFilter' + - in: query + name: field + description: The account field(s) you want to search in. + required: true + schema: + $ref: '#/components/schemas/AccountSearchFieldFilter' + responses: + "200": + description: A list of accounts. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/AccountArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/search/transactions: + get: + summary: Search for transactions + description: Searches through the users transactions. + externalDocs: + description: Search Documentation + url: https://docs.firefly-iii.org/how-to/firefly-iii/features/search/ + operationId: searchTransactions + tags: + - search + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: query + name: query + description: The query you wish to search for. + required: true + schema: + type: string + example: "groceries" + + responses: + "200": + description: A list of transactions. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/TransactionArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/search/transactions/count: + get: + summary: Count transactions matching the given filters. + description: | + Returns the number of transactions that match the given meta-field filters. This is useful to check for + existing transactions (for example to avoid duplicates) before storing new data. + operationId: countTransactions + tags: + - search + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: external_identifier + description: Count transactions with this exact external identifier. + required: false + schema: + type: string + example: "abcd-1234" + - in: query + name: internal_reference + description: Count transactions with this exact internal reference. + required: false + schema: + type: string + example: "INV-998" + - in: query + name: notes + description: Count transactions whose notes contain this string. + required: false + schema: + type: string + example: "groceries" + - in: query + name: description + description: Count transactions with this exact description. + required: false + schema: + type: string + example: "Monthly rent" + - in: query + name: include_deleted + description: Whether to include soft-deleted transactions in the count. + required: false + schema: + type: boolean + example: false + responses: + "200": + description: The number of matching transactions. + content: + application/json: + schema: + type: object + properties: + count: + type: integer + example: 42 + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/summary/basic: + get: + tags: + - summary + operationId: getBasicSummary + summary: Returns basic sums of the users data. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: start + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: end + description: | + A date formatted YYYY-MM-DD. + required: true + schema: + type: string + format: date + - in: query + name: currency_code + description: | + A currency code like EUR or USD, to filter the result. + required: false + schema: + type: string + format: string + description: | + Returns basic sums of the users data, like the net worth, spent and earned amounts. It is multi-currency, and is used in Firefly III to populate the dashboard. + responses: + '200': + description: An array of sums. It depends on the user what you can expect to get back, so please try this out on the demo site. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/BasicSummary' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/about: + get: + tags: + - about + operationId: getAbout + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + summary: System information end point. + description: | + Returns general system information and versions of the (supporting) software. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: The available system information + content: + application/json: + schema: + $ref: '#/components/schemas/SystemInfo' + /v1/about/user: + get: + tags: + - about + summary: Currently authenticated user endpoint. + operationId: getCurrentUser + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + description: | + Returns the currently authenticated user. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: The user + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/UserSingle' + /v1/release-notes/{version}: + get: + tags: + - about + summary: Release notes endpoint. + operationId: getReleaseNotes + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: version + required: false + schema: + type: string + format: string + example: 6.8.0 + description: The version of the release notes to retrieve. Also possible is "v6.7.8" or "develop-2026-10-12". Notice the dash instead of the forward slash. + description: | + Returns the release notes for a specific version of Firefly III. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: The release notes for the specified version. + content: + application/json: + schema: + $ref: '#/components/schemas/ReleaseNotes' + /v1/batch/finish: + post: + tags: + - about + operationId: finishBatch + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + summary: Finish a batch of unprocessed transactions. + description: | + summary: Finish a batch of unprocessed transactions. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "204": + description: Empty response when the update was successful. A future improvement is to include the changed transactions. + /v1/configuration: + get: + summary: Get Firefly III system configuration values. + description: Returns all editable and not-editable configuration values for this Firefly III installation + operationId: getConfiguration + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - configuration + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: System configuration values + content: + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ConfigurationArray' + application/json: + schema: + $ref: '#/components/schemas/ConfigurationArray' + /v1/configuration/{name}: + get: + summary: Get a single Firefly III system configuration value + description: Returns one configuration variable for this Firefly III installation + operationId: getSingleConfiguration + tags: + - configuration + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: name + required: true + schema: + $ref: '#/components/schemas/ConfigValueFilter' + description: The name of the configuration value you want to know. + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: One system configuration value + content: + application/json: + schema: + $ref: '#/components/schemas/ConfigurationSingle' + put: + tags: + - configuration + summary: Update configuration value + operationId: setConfiguration + description: Set a single configuration value. Not all configuration values can be updated so the list of accepted configuration variables is small. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: name + required: true + schema: + $ref: '#/components/schemas/ConfigValueUpdateFilter' + description: The name of the configuration value you want to update. + responses: + "200": + description: 'New configuration value stored, result in response.' + content: + application/json: + schema: + $ref: '#/components/schemas/ConfigurationSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + requestBody: + description: JSON array with the necessary account information or key=value pairs. See the model for the exact specifications. + content: + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ConfigurationUpdate' + application/json: + schema: + $ref: '#/components/schemas/ConfigurationUpdate' + required: true + /v1/cron/{cliToken}: + get: + tags: + - about + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: cliToken + required: true + schema: + type: string + format: string + example: d5ea6b5fb774618dd6ad6ba6e0a7f55c + description: The CLI token of any user in Firefly III, required to run the cron job. OR this is the `STATIC_CRON_TOKEN`. + - in: query + name: date + description: | + A date formatted YYYY-MM-DD. This can be used to make the cron job pretend it's running + on another day. + required: false + schema: + type: string + format: date + example: "2026-10-01" + - in: query + name: force + description: | + Forces the cron job to fire, regardless of whether it has fired before. This may result + in double transactions or weird budgets, so be careful. Only system owners can do this. + required: false + schema: + type: boolean + example: false + operationId: getCron + summary: Cron job endpoint + description: | + Firefly III has one endpoint for its various cron related tasks. Send a GET to this endpoint + to run the cron. The cron requires the CLI token to be present. The cron job will fire for all + users. + responses: + "200": + description: The result of the cron job(s) firing. + content: + application/json: + schema: + $ref: '#/components/schemas/CronResult' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/users: + get: + summary: List all users. + description: List all the users in this instance of Firefly III. + operationId: listUser + tags: + - users + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of users. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/UserArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new user + description: | + Creates a new user. The data required can be submitted as a JSON body or as a list of parameters. The user will be given a random password, which they can reset using the "forgot password" function. + operationId: storeUser + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/User' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/User' + description: "JSON array or key=value pairs with the necessary user information. See the model for the exact specifications." + required: true + responses: + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + "200": + description: 'New user stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/UserSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + /v1/users/{id}: + get: + summary: Get a single user. + description: Gets all info of a single user. + operationId: getUser + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The user ID. + tags: + - users + responses: + "200": + description: 'The requested user.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/UserSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateUser + tags: + - users + description: Update existing user. + summary: Update an existing user's information. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The user ID. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/User' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/User' + description: JSON array with updated user information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated user stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/UserSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteUser + description: Delete a user. You cannot delete the user you're authenticated with. This cannot be undone. Be careful. + summary: Delete a user. + tags: + - users + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The user ID. + responses: + "204": + description: User deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/preferences: + get: + summary: List all users preferences. + description: List all of the preferences of the user. + operationId: listPreference + tags: + - preferences + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of preferences. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PreferenceArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + tags: + - preferences + summary: Store a new preference for this user. + operationId: storePreference + description: This endpoint creates a new preference. The name and data are free-format, and entirely up to you. If the preference is not used in Firefly III itself it may not be configurable through the user interface, but you can use this endpoint to persist custom data for your own app. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + responses: + "200": + description: 'New account stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PreferenceSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Preference' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/Preference' + description: JSON array with the necessary preference information or key=value pairs. See the model for the exact specifications. + required: true + /v1/preferences/{name}: + get: + summary: Return a single preference. + description: Return a single preference and the value. + operationId: getPreference + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: name + required: true + schema: + type: string + format: string + example: currencyPreference + description: The name of the preference. + tags: + - preferences + responses: + "200": + description: A single preference. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PreferenceSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + summary: Update preference + description: Update a user's preference. + operationId: updatePreference + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: name + required: true + schema: + type: string + format: string + example: currencyPreference + description: The name of the preference. Will always overwrite. Will be created if it does not exist. + tags: + - preferences + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PreferenceUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PreferenceUpdate' + description: "JSON array or key=value pairs with the necessary preference information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'Updated preference.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/PreferenceSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/webhooks/{id}/messages: + get: + summary: Get all the messages of a single webhook. + description: When a webhook is triggered the actual message that will be send is stored in a "message". You can view and analyse these messages. + operationId: getWebhookMessages + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The webhook ID. + tags: + - webhooks + responses: + "200": + description: A list of webhook messages. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/WebhookMessageArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/webhooks/{id}/messages/{messageId}: + get: + summary: Get a single message from a webhook. + description: When a webhook is triggered it will store the actual content of the webhook in a webhook message. You can view and analyse a single one using this endpoint. + operationId: getSingleWebhookMessage + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The webhook ID. + - in: path + name: messageId + required: true + schema: + type: integer + example: 1 + description: The webhook message ID. + tags: + - webhooks + responses: + "200": + description: 'A single webhook message.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/WebhookMessageSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteWebhookMessage + summary: Delete a webhook message. + description: Delete a webhook message. Any time a webhook is triggered the message is stored before it's sent. You can delete them before or after sending. + tags: + - webhooks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The webhook ID. + - in: path + name: messageId + required: true + schema: + type: integer + example: 1 + description: The webhook message ID. + responses: + "204": + description: Webhook message deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/webhooks/{id}/messages/{messageId}/attempts: + get: + summary: Get all the failed attempts of a single webhook message. + description: When a webhook message fails to send it will store the failure in an "attempt". You can view and analyse these. Webhook messages that receive too many attempts (failures) will not be sent again. You must first clear out old attempts before the message can go out again. + operationId: getWebhookMessageAttempts + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The webhook ID. + - in: path + name: messageId + required: true + schema: + type: integer + example: 1 + description: The webhook message ID. + + tags: + - webhooks + responses: + "200": + description: A list of webhook attempts. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/WebhookAttemptArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/webhooks/{id}/messages/{messageId}/attempts/{attemptId}: + get: + summary: Get a single failed attempt from a single webhook message. + description: When a webhook message fails to send it will store the failure in an "attempt". You can view and analyse these. Webhooks messages that receive too many attempts (failures) will not be fired. You must first clear out old attempts and try again. This endpoint shows you the details of a single attempt. The ID of the attempt must match the corresponding webhook and webhook message. + operationId: getSingleWebhookMessageAttempt + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The webhook ID. + - in: path + name: messageId + required: true + schema: + type: integer + example: 1 + description: The webhook message ID. + - in: path + name: attemptId + required: true + schema: + type: integer + example: 1 + description: The webhook attempt ID. + tags: + - webhooks + responses: + "200": + description: 'A single webhook attempt.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/WebhookAttemptSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteWebhookMessageAttempt + summary: Delete a webhook attempt. + description: Delete a webhook message attempt. If you delete all attempts for a webhook message, Firefly III will (once again) assume all is well with the webhook message and will try to send it again. + tags: + - webhooks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The webhook ID. + - in: path + name: messageId + required: true + schema: + type: integer + example: 1 + description: The webhook message ID. + - in: path + name: attemptId + required: true + schema: + type: integer + example: 1 + description: The webhook message attempt ID. + responses: + "204": + description: Webhook message attempt deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/webhooks/{id}/submit: + post: + summary: Submit messages for a webhook. + description: This endpoint will submit any open messages for this webhook. This is an asynchronous operation, so you can't see the result. Refresh the webhook message and/or the webhook message attempts to see the results. This may take some time if the webhook receiver is slow. + operationId: submitWebhook + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The webhook ID. + tags: + - webhooks + responses: + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "200": + description: OK. + "204": + description: No messages to send, so did nothing. + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/webhooks/{id}/trigger-transaction/{transactionId}: + post: + summary: Trigger webhook for a given transaction. + description: This endpoint will execute this webhook for a given transaction ID. This is an asynchronous operation, so you can't see the result. Refresh the webhook message and/or the webhook message attempts to see the results. This may take some time if the webhook receiver is slow. + operationId: triggerTransactionWebhook + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + schema: + type: string + example: "123" + description: The webhook ID. + - in: path + name: transactionId + required: true + schema: + type: string + example: "123" + description: The transaction ID. + tags: + - webhooks + responses: + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "204": + description: Webhook triggered successfully. + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/webhooks: + get: + summary: List all webhooks. + description: List all the user's webhooks. + operationId: listWebhook + tags: + - webhooks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: query + name: limit + description: Number of items per page. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 10 + + - in: query + name: page + description: Page number. The default pagination is per 50 items. + required: false + schema: + type: integer + format: int32 + example: 1 + + responses: + "200": + description: A list of webhooks. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/WebhookArray' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + post: + summary: Store a new webhook + description: | + Creates a new webhook. The data required can be submitted as a JSON body or as a list of parameters. The webhook will be given a random secret. + operationId: storeWebhook + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + tags: + - webhooks + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookStore' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/WebhookStore' + description: "JSON array or key=value pairs with the necessary webhook information. See the model for the exact specifications." + required: true + responses: + "200": + description: 'New webhook stored, result in response.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/WebhookSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + /v1/webhooks/{id}: + get: + summary: Get a single webhook. + description: Gets all info of a single webhook. + operationId: getWebhook + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + example: "123" + required: true + schema: + type: string + example: "123" + description: The webhook ID. + tags: + - webhooks + responses: + "200": + description: 'The requested webhook.' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/WebhookSingle' + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + put: + operationId: updateWebhook + tags: + - webhooks + summary: Update existing webhook. + description: Update an existing webhook's information. If you wish to reset the secret, submit any value as the "secret". Firefly III will take this as a hint and reset the secret of the webhook. + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + example: "123" + schema: + type: string + example: "123" + description: The webhook ID. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookUpdate' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/WebhookUpdate' + description: JSON array with updated webhook information. See the model for the exact specifications. + required: true + responses: + "200": + description: 'Updated webhook stored, result in response' + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/WebhookSingle' + "422": + description: 'Validation error. The body will have the exact details.' + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationErrorResponse' + + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + + delete: + operationId: deleteWebhook + description: Delete a webhook. + summary: Delete a webhook. + tags: + - webhooks + parameters: + - name: X-Trace-Id + in: header + description: Unique identifier associated with this request. + required: false + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + schema: + type: string + format: uuid + example: 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + + - in: path + name: id + required: true + example: "123" + schema: + type: string + example: "123" + description: The webhook ID. + responses: + "204": + description: Webhook deleted. + "401": + description: Unauthenticated + content: + application/json: + schema: + $ref: '#/components/schemas/UnauthenticatedResponse' + + "404": + description: Page not found + content: + application/json: + schema: + $ref: '#/components/schemas/NotFoundResponse' + + "400": + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/BadRequestResponse' + + "500": + description: Internal exception + content: + application/json: + schema: + $ref: '#/components/schemas/InternalExceptionResponse' + +components: + schemas: + AccountArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/AccountRead' + meta: + $ref: '#/components/schemas/Meta' + AttachmentArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/AttachmentRead' + meta: + $ref: '#/components/schemas/Meta' + AutocompleteAccountArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteAccount' + AutocompleteBillArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteBill' + AutocompleteBudgetArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteBudget' + AutocompleteCategoryArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteCategory' + AutocompleteCurrencyArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteCurrency' + AutocompleteCurrencyCodeArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteCurrencyCode' + AutocompleteObjectGroupArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteObjectGroup' + AutocompletePiggyArray: + type: array + items: + $ref: '#/components/schemas/AutocompletePiggy' + AutocompletePiggyBalanceArray: + type: array + items: + $ref: '#/components/schemas/AutocompletePiggyBalance' + AutocompleteRecurrenceArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteRecurrence' + AutocompleteRuleArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteRule' + AutocompleteRuleGroupArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteRuleGroup' + AutocompleteTagArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteTag' + AutocompleteTransactionArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteTransaction' + AutocompleteTransactionIDArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteTransactionID' + AutocompleteTransactionTypeArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteTransactionType' + AutocompleteTransactionWithMetaArray: + type: array + items: + $ref: '#/components/schemas/AutocompleteTransactionWithMeta' + AvailableBudgetArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/AvailableBudgetRead' + meta: + $ref: '#/components/schemas/Meta' + BillArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/BillRead' + meta: + $ref: '#/components/schemas/Meta' + BudgetArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/BudgetRead' + meta: + $ref: '#/components/schemas/Meta' + BudgetLimitArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/BudgetLimitRead' + meta: + $ref: '#/components/schemas/Meta' + CategoryArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/CategoryRead' + meta: + $ref: '#/components/schemas/Meta' + ConfigurationArray: + type: array + items: + $ref: '#/components/schemas/Configuration' + CurrencyArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/CurrencyRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + CurrencyExchangeRateArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/CurrencyExchangeRateRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + LinkTypeArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/LinkTypeRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + ObjectGroupArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/ObjectGroupRead' + meta: + $ref: '#/components/schemas/Meta' + PiggyBankArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/PiggyBankRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + PiggyBankEventArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/PiggyBankEventRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + PreferenceArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/PreferenceRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + RecurrenceArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/RecurrenceRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + RuleArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/RuleRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + RuleGroupArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/RuleGroupRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + TagArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/TagRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + TransactionArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/TransactionRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + TransactionLinkArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/TransactionLinkRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + UserArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/UserRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + UserGroupArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/UserGroupRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + WebhookArray: + type: object + required: + - data + - meta + - links + properties: + data: + type: array + items: + $ref: '#/components/schemas/WebhookRead' + meta: + $ref: '#/components/schemas/Meta' + links: + $ref: '#/components/schemas/PageLink' + WebhookAttemptArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/WebhookAttemptRead' + meta: + $ref: '#/components/schemas/Meta' + WebhookMessageArray: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/WebhookMessageRead' + meta: + $ref: '#/components/schemas/Meta' + AutocompleteAccount: + type: object + required: + - id + - name + - name_with_balance + - active + - type + - currency_id + - currency_name + - currency_code + - currency_symbol + - currency_decimal_places + - account_currency_id + - account_currency_name + - account_currency_code + - account_currency_symbol + - account_currency_decimal_places + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Checking Account" + description: Name of the account found by an auto-complete search. + name_with_balance: + type: string + format: string + example: "Checking Account ($123.45)" + description: Asset accounts and liabilities have a second field with the given date's account balance in the account currency or primary currency. + active: + type: boolean + example: true + description: Is the account active or not? + type: + type: string + format: string + example: "Asset account" + description: Account type of the account found by the auto-complete search. + currency_id: + type: string + format: string + example: "12" + description: ID for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + currency_name: + type: string + format: string + example: "Euro" + description: Currency name for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + currency_code: + type: string + format: string + example: "EUR" + description: Currency code for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + currency_symbol: + type: string + format: string + example: "$" + description: Currency symbol for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimal places for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + account_currency_id: + type: string + format: string + example: "2" + description: ID for the currency used by this account. Even if "convertToPrimary" is on, the account currency ID is displayed here. + account_currency_name: + type: string + format: string + example: "US Dollar" + description: Name for the currency used by this account. Even if "convertToPrimary" is on, the account currency name is displayed here. + account_currency_code: + type: string + format: string + example: "USD" + description: Code for the currency used by this account. Even if "convertToPrimary" is on, the account currency code is displayed here. + account_currency_symbol: + type: string + format: string + example: "$" + description: Code for the currency used by this account. Even if "convertToPrimary" is on, the account currency code is displayed here. + account_currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimal places for the currency used by this account. Even if "convertToPrimary" is on, the account currency code is displayed here. + AutocompleteBill: + type: object + required: + - id + - name + - active + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Yearly bill" + description: Name of the bill found by an auto-complete search. + active: + type: boolean + example: true + description: Is the bill active or not? + AutocompleteBudget: + type: object + required: + - id + - name + - active + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Groceries" + description: Name of the budget found by an auto-complete search. + active: + type: boolean + example: true + description: Is the budget active or not? + AutocompleteCategory: + type: object + required: + - id + - name + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Category X" + description: Name of the category found by an auto-complete search. + AutocompleteCurrency: + type: object + required: + - id + - name + - code + - symbol + - decimal_places + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Currency name" + description: Currency name. + code: + type: string + format: string + example: "EUR" + description: Currency code. + symbol: + type: string + format: string + example: "$" + decimal_places: + type: integer + format: int32 + example: 2 + AutocompleteCurrencyCode: + type: object + required: + - id + - name + - code + - symbol + - decimal_places + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Currency name (XCN)" + description: Currency name with the code between brackets. + code: + type: string + format: string + example: "EUR" + description: Currency code. + symbol: + type: string + format: string + example: "$" + decimal_places: + type: integer + format: int32 + example: 2 + AutocompleteObjectGroup: + type: object + required: + - id + - title + - name + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Object Group one" + description: Title of the object group found by an auto-complete search. + title: + type: string + format: string + example: "Object Group one" + description: Title of the object group found by an auto-complete search. + AutocompletePiggy: + type: object + required: + - id + - name + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "New couch" + description: Name of the piggy bank found by an auto-complete search. + currency_id: + type: string + format: string + example: "12" + description: Currency ID for this piggy bank. This will always be the currency of the piggy bank, never the user's primary currency. + currency_code: + type: string + format: string + example: "EUR" + description: Currency code for this piggy bank. This will always be the currency of the piggy bank, never the user's primary currency. + currency_symbol: + type: string + format: string + example: "$" + currency_name: + type: string + format: string + example: "Euro" + description: Currency name for the currency used by this piggy bank. This will always be the currency of the piggy bank, never the user's primary currency. + currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimal places for the currency used by this piggy bank. This will always be the currency of the piggy bank, never the user's primary currency. + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + AutocompletePiggyBalance: + type: object + required: + - id + - name + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "New couch" + description: Name of the piggy bank found by an auto-complete search. + name_with_balance: + type: string + format: string + example: "New couch ($234.56 / $600)" + description: Name of the piggy bank found by an auto-complete search, including the currently saved amount and the target amount. + currency_id: + type: string + format: string + example: "12" + description: Currency ID for the currency used by this piggy bank. This will always be the piggy bank's currency, never the primary currency. + currency_code: + type: string + format: string + example: "EUR" + description: Currency code for the currency used by this piggy bank. This will always be the piggy bank's currency, never the primary currency. + currency_symbol: + type: string + format: string + example: "$" + description: Currency symbol for the currency used by this piggy bank. This will always be the piggy bank's currency, never the primary currency. + currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Currency decimal places for the currency used by this piggy bank. This will always be the piggy bank's currency, never the primary currency. + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + AutocompleteRecurrence: + type: object + required: + - id + - name + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Yearly bill" + description: Name of the recurrence found by an auto-complete search. + description: + type: string + format: string + example: "Should trigger daily." + description: Description of the recurrence found by auto-complete. + active: + type: boolean + example: true + description: Is the recurring transaction active or not? + AutocompleteRule: + type: object + required: + - id + - name + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Rule one" + description: Name of the rule found by an auto-complete search. + description: + type: string + format: string + example: "Useful rule." + description: Description of the rule found by auto-complete. + active: + type: boolean + example: true + description: Is the bill active or not? + AutocompleteRuleGroup: + type: object + required: + - id + - name + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Rule group one" + description: Name of the rule group found by an auto-complete search. + description: + type: string + format: string + example: "Some rule group." + description: Description of the rule group found by auto-complete. + active: + type: boolean + example: true + description: Is the bill active or not? + AutocompleteTag: + type: object + required: + - id + - name + - tag + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "too-expensive-tag-example" + description: Name of the tag found by an auto-complete search. + tag: + type: string + format: string + example: "too-expensive-tag-example" + description: Name of the tag found by an auto-complete search. + AutocompleteTransaction: + type: object + required: + - id + - name + - description + properties: + id: + type: string + format: string + example: "2" + description: The ID of a transaction journal (basically a single split). + transaction_group_id: + type: string + format: string + example: "2" + description: The ID of the underlying transaction group. + name: + type: string + format: string + example: "Transaction" + description: Transaction description + description: + type: string + format: string + example: "Transaction" + description: Transaction description + AutocompleteTransactionID: + type: object + required: + - id + - name + - description + properties: + id: + type: string + format: string + example: "2" + description: The ID of a transaction journal (basically a single split). + transaction_group_id: + type: string + format: string + example: "2" + description: The ID of the underlying transaction group. + name: + type: string + format: string + example: "#12: Transaction" + description: Transaction description with ID in the name. + description: + type: string + format: string + example: "#12: Transaction" + description: Transaction description with ID in the name. + AutocompleteTransactionType: + type: object + required: + - id + - name + - type + properties: + id: + type: string + format: string + example: "2" + name: + type: string + format: string + example: "Withdrawal" + description: Type of the object found by an auto-complete search. + type: + type: string + format: string + example: "Withdrawal" + description: Name of the object found by an auto-complete search. + AutocompleteTransactionWithMeta: + type: object + required: + - id + - name + - description + properties: + id: + type: string + format: string + example: "2" + description: The ID of a transaction journal (basically a single split). + transaction_group_id: + type: string + format: string + example: "2" + description: The ID of the underlying transaction group. + name: + type: string + format: string + example: "#12: Transaction" + description: Transaction description with ID in the name. + description: + type: string + format: string + example: "#12: Transaction" + description: Transaction description with ID in the name. + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + currency_code: + type: string + format: string + example: "EUR" + description: Currency code. + amount: + type: string + format: amount + example: "123.45" + description: "The amount that was paid for this subscription in the subscription's currency." + ChartDataPoint: + type: object + properties: + key: + type: string + format: string + example: "value" + description: "The key is the label of the value, so for example: '2018-01-01' => 13 or 'Groceries' => -123." + ChartDataSet: + type: object + properties: + label: + type: string + format: string + example: "Checking account" + description: "This is the title of the current set. It can refer to an account, a budget or another object (by name)." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + start_date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + end_date: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + type: + type: string + format: string + example: "line" + description: "Indicated the type of chart that is expected to be rendered. You can safely ignore this if you want." + period: + $ref: '#/components/schemas/ChartDatasetPeriodProperty' + yAxisID: + type: integer + format: int32 + example: 0 + description: "Used to indicate the Y axis for this data set. Is usually between 0 and 1 (left and right side of the chart)." + entries: + type: object + description: "The actual entries for this data set. They 'key' value is the label for the data point. The value is the actual (numerical) value." + items: + $ref: '#/components/schemas/ChartDataPoint' + pc_entries: + type: object + description: "The actual entries for this data set. They 'key' value is the label for the data point. The value is the actual (numerical) value." + items: + $ref: '#/components/schemas/ChartDataPoint' + ChartLine: + type: array + items: + $ref: '#/components/schemas/ChartDataSet' + DataDestroyObject: + type: string + enum: + - not_assets_liabilities + - budgets + - bills + - piggy_banks + - rules + - recurring + - categories + - tags + - object_groups + - accounts + - asset_accounts + - expense_accounts + - revenue_accounts + - liabilities + - transactions + - withdrawals + - deposits + - transfers + AccountSearchFieldFilter: + type: string + enum: + - all + - iban + - name + - number + - id + ConfigValueFilter: + type: string + example: "configuration.is_demo_site" + description: "Title of the configuration value." + enum: + - configuration.is_demo_site + - configuration.permission_update_check + - configuration.last_update_check + - configuration.single_user_mode + - firefly.version + - firefly.default_location + - firefly.account_to_transaction + - firefly.allowed_opposing_types + - firefly.accountRoles + - firefly.valid_liabilities + - firefly.interest_periods + - firefly.enable_external_map + - firefly.expected_source_types + - app.timezone + - firefly.bill_periods + - firefly.credit_card_types + - firefly.languages + - firefly.valid_view_ranges + - cer.enabled + - firefly.preselected_accounts + - firefly.rule-actions + - firefly.context-rule-actions + - search.operators + - webhook.triggers + - webhook.responses + - webhook.deliveries + ConfigValueUpdateFilter: + type: string + enum: + - configuration.is_demo_site + - configuration.permission_update_check + - configuration.last_update_check + - configuration.single_user_mode + - configuration.enable_exchange_rates + - configuration.use_running_balance + - configuration.enable_external_map + - configuration.enable_external_rates + - configuration.allow_webhooks + - configuration.valid_url_protocols + ExportFileFilter: + type: string + enum: + - csv + InsightGroup: + type: array + items: + $ref: '#/components/schemas/InsightGroupEntry' + InsightGroupEntry: + type: object + properties: + id: + type: string + format: string + example: "123" + description: "This ID is a reference to the original object." + name: + type: string + format: string + example: "Land lord" + description: "This is the name of the object." + difference: + type: string + format: string + example: "-123.45" + description: "The amount spent or earned between start date and end date, a number defined as a string, for this object and all asset accounts." + difference_float: + type: number + format: double + example: -123.45 + description: "The amount spent or earned between start date and end date, a number as a float, for this object and all asset accounts. May have rounding errors." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the expenses listed for this account." + currency_code: + type: string + format: string + example: "EUR" + description: "The currency code of the expenses listed for this account." + InsightTotal: + type: array + items: + $ref: '#/components/schemas/InsightTotalEntry' + InsightTotalEntry: + type: object + properties: + difference: + type: string + format: string + example: "123.45" + description: "The amount spent between start date and end date, defined as a string, for this expense account and all asset accounts." + difference_float: + type: number + format: double + example: 123.45 + description: "The amount spent between start date and end date, defined as a string, for this expense account and all asset accounts. This number is a float (double) and may have rounding errors." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the expenses listed for this expense account." + currency_code: + type: string + format: string + example: "EUR" + description: "The currency code of the expenses listed for this expense account." + InsightTransfer: + type: array + items: + $ref: '#/components/schemas/InsightTransferEntry' + InsightTransferEntry: + type: object + properties: + id: + type: string + format: string + example: "123" + description: "This ID is a reference to the original object." + name: + type: string + format: string + example: "Land lord" + description: "This is the name of the object." + difference: + type: string + format: string + example: "-123.45" + description: "The total amount transferred between start date and end date, a number defined as a string, for this asset account." + difference_float: + type: number + format: double + example: -123.45 + description: "The total amount transferred between start date and end date, a number as a float, for this asset account. May have rounding errors." + in: + type: string + format: string + example: "123.45" + description: "The total amount transferred TO this account between start date and end date, a number defined as a string, for this asset account." + in_float: + type: number + format: double + example: 123.45 + description: "The total amount transferred FROM this account between start date and end date, a number as a float, for this asset account. May have rounding errors." + out: + type: string + format: string + example: "123.45" + description: "The total amount transferred FROM this account between start date and end date, a number defined as a string, for this asset account." + out_float: + type: number + format: double + example: 123.45 + description: "The total amount transferred TO this account between start date and end date, a number as a float, for this asset account. May have rounding errors." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the expenses listed for this account." + currency_code: + type: string + format: string + example: "EUR" + description: "The currency code of the expenses listed for this account." + CategoryRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "categories" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/CategoryProperties' + CategorySingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/CategoryRead' + ConfigurationSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Configuration' + CurrencyRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "currencies" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/CurrencyProperties' + CurrencySingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/CurrencyRead' + LinkTypeRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "link_types" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/LinkType' + links: + $ref: '#/components/schemas/ObjectLink' + LinkTypeSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/LinkTypeRead' + ObjectGroupRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "object_groups" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/ObjectGroup' + ObjectGroupSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/ObjectGroupRead' + PiggyBankEventRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "piggy_bank_events" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/PiggyBankEventProperties' + links: + $ref: '#/components/schemas/ObjectLink' + PiggyBankRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "piggy_banks" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/PiggyBankProperties' + links: + $ref: '#/components/schemas/ObjectLink' + PiggyBankSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/PiggyBankRead' + PreferenceRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "preferences" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/Preference' + PreferenceSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/PreferenceRead' + RecurrenceRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "recurrences" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/RecurrenceProperties' + links: + $ref: '#/components/schemas/ObjectLink' + RecurrenceSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/RecurrenceRead' + RuleGroupRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "rules_group" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/RuleGroup' + links: + $ref: '#/components/schemas/ObjectLink' + RuleGroupSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/RuleGroupRead' + RuleRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "rules" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/Rule' + links: + $ref: '#/components/schemas/ObjectLink' + RuleSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/RuleRead' + TagRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "tags" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/TagModel' + links: + $ref: '#/components/schemas/ObjectLink' + TagSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/TagRead' + TransactionLinkRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "transactionLinks" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/TransactionLink' + links: + $ref: '#/components/schemas/ObjectLink' + TransactionLinkSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/TransactionLinkRead' + TransactionRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "transactions" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/Transaction' + links: + $ref: '#/components/schemas/ObjectLink' + TransactionSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/TransactionRead' + UserRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "users" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/User' + links: + $ref: '#/components/schemas/ObjectLink' + WebhookAttemptRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "webhook_attempts" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/WebhookAttempt' + WebhookAttemptSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/WebhookAttemptRead' + WebhookMessageRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "webhook_messages" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/WebhookMessage' + WebhookMessageSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/WebhookMessageRead' + WebhookRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "webhooks" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/WebhookProperties' + links: + $ref: '#/components/schemas/ObjectLink' + WebhookSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/WebhookRead' + AccountProperties: + type: object + required: + - name + - type + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + active: + type: boolean + example: false + default: true + order: + type: integer + format: int32 + example: 1 + nullable: true + description: "Order of the account. Is NULL if account is not asset or liability." + name: + type: string + format: string + example: "My checking account" + type: + $ref: '#/components/schemas/ShortAccountTypeProperty' + account_role: + $ref: '#/components/schemas/AccountRoleProperty' + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_order: + type: integer + format: int32 + example: 5 + readOnly: true + nullable: true + description: The order of the group. At least 1, for the highest sorting. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the account has a currency setting. If false, the account uses the administration's primary currency. Asset accounts and liability accounts always have a currency setting, while expense and revenue accounts do not." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + current_balance: + type: string + format: amount + example: "123.45" + readOnly: true + description: "The current balance of the account in the account's currency. If the account has no currency, this is the balance in the administration's primary currency. Either way, the `currency_*` fields reflect the currency used." + pc_current_balance: + type: string + format: amount + example: "123.45" + readOnly: true + nullable: true + description: "The current balance of the account in the administration's primary currency. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings." + balance_difference: + type: string + format: amount + example: "123.45" + readOnly: true + description: "If you submit a start AND end date, this will be the difference between those two moments." + pc_balance_difference: + type: string + format: amount + example: "123.45" + readOnly: true + nullable: true + description: "If you submit a start AND end date, this will be the difference in the currency of the account or the administration's primary currency between those two moments." + opening_balance: + type: string + format: amount + example: "-1012.12" + description: "Represents the opening balance, the initial amount this account holds in the currency of the account or the administration's primary currency if the account has no currency. Either way, the `currency_*` fields reflect the currency used." + pc_opening_balance: + type: string + format: amount + example: "-1012.12" + description: "The opening balance of the account in the administration's primary currency (pc). The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings." + virtual_balance: + type: string + format: amount + example: "123.45" + description: "The virtual balance of the account in the account's currency or the administration's primary currency if the account has no currency." + pc_virtual_balance: + type: string + format: amount + example: "123.45" + description: "The virtual balance of the account in the administration's primary currency (pc). The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings." + debt_amount: + type: string + format: amount + nullable: true + example: "1012.12" + description: "In liability accounts (loans, debts and mortgages), this is the amount of debt in the account's currency (see the `currency_*` fields). In asset accounts, this is NULL." + pc_debt_amount: + type: string + format: amount + nullable: true + example: "1012.12" + description: "In liability accounts (loans, debts and mortgages), this is the amount of debt in the administration's primary currency (see the `currency_*` fields. In asset accounts, this is NULL." + current_balance_date: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + readOnly: true + description: "The timestamp for this date is always 23:59:59, to indicate it's the balance at the very END of that particular day." + notes: + type: string + format: string + nullable: true + example: "Some example notes" + monthly_payment_date: + nullable: true + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Mandatory when the account_role is ccAsset. Moment at which CC payment installments are asked for by the bank." + credit_card_type: + $ref: '#/components/schemas/CreditCardTypeProperty' + account_number: + type: string + format: string + nullable: true + example: "7009312345678" + iban: + type: string + format: iban + example: "GB98MIDL07009312345678" + nullable: true + bic: + type: string + format: string + example: "BOFAUS3N" + nullable: true + opening_balance_date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + nullable: true + description: Represents the date of the opening balance. + liability_type: + $ref: '#/components/schemas/LiabilityTypeProperty' + liability_direction: + $ref: '#/components/schemas/LiabilityDirectionProperty' + interest: + type: string + format: string + example: "5.3" + description: "Mandatory when type is liability. Interest percentage." + nullable: true + interest_period: + $ref: '#/components/schemas/InterestPeriodProperty' + include_net_worth: + type: boolean + example: true + default: true + longitude: + type: number + format: double + example: 5.916667 + nullable: true + description: Latitude of the accounts's location, if applicable. Can be used to draw a map. + latitude: + type: number + format: double + example: 51.983333 + nullable: true + description: Latitude of the accounts's location, if applicable. Can be used to draw a map. + zoom_level: + type: integer + format: int32 + example: 6 + nullable: true + description: "Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels." + last_activity: + nullable: true + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Last activity of the account." + AccountRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "accounts" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/AccountProperties' + AccountSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/AccountRead' + AccountStore: + type: object + required: + - name + - type + properties: + name: + type: string + format: string + example: "My checking account" + type: + $ref: '#/components/schemas/ShortAccountTypeProperty' + iban: + type: string + format: iban + example: "GB98MIDL07009312345678" + nullable: true + bic: + type: string + format: string + example: "BOFAUS3N" + nullable: true + account_number: + type: string + format: string + nullable: true + example: "7009312345678" + opening_balance: + type: string + format: amount + example: "-1012.12" + description: Represents the opening balance, the initial amount this account holds. + opening_balance_date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + nullable: true + description: Represents the date of the opening balance. + virtual_balance: + type: string + format: amount + example: "123.45" + currency_id: + type: string + format: string + example: "12" + description: "Use either currency_id or currency_code. Defaults to the user's financial administration's currency." + currency_code: + type: string + format: string + example: "EUR" + description: "Use either currency_id or currency_code. Defaults to the user's financial administration's currency." + active: + type: boolean + example: false + default: true + description: "If omitted, defaults to true." + order: + type: integer + format: int32 + example: 1 + description: "Order of the account" + include_net_worth: + type: boolean + example: true + default: true + description: "If omitted, defaults to true." + account_role: + $ref: '#/components/schemas/AccountRoleProperty' + credit_card_type: + $ref: '#/components/schemas/CreditCardTypeProperty' + monthly_payment_date: + nullable: true + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Mandatory when the account_role is ccAsset. Moment at which CC payment installments are asked for by the bank." + liability_type: + $ref: '#/components/schemas/LiabilityTypeProperty' + liability_direction: + $ref: '#/components/schemas/LiabilityDirectionProperty' + interest: + type: string + format: string + example: "5.3" + default: "0" + description: "Mandatory when type is liability. Interest percentage." + nullable: true + interest_period: + $ref: '#/components/schemas/InterestPeriodProperty' + notes: + type: string + format: string + nullable: true + example: "Some example notes" + latitude: + type: number + format: double + example: 51.983333 + nullable: true + description: Latitude of the accounts's location, if applicable. Can be used to draw a map. + longitude: + type: number + format: double + example: 5.916667 + nullable: true + description: Latitude of the accounts's location, if applicable. Can be used to draw a map. + zoom_level: + type: integer + format: int32 + example: 6 + nullable: true + description: "Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels." + AccountUpdate: + type: object + required: + - name + - type + properties: + name: + type: string + format: string + example: "My checking account" + iban: + type: string + format: iban + example: "GB98MIDL07009312345678" + nullable: true + bic: + type: string + format: string + example: "BOFAUS3N" + nullable: true + account_number: + type: string + format: string + nullable: true + example: "7009312345678" + opening_balance: + type: string + format: amount + example: "-1012.12" + opening_balance_date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + nullable: true + virtual_balance: + type: string + format: amount + example: "123.45" + currency_id: + type: string + format: string + example: "12" + description: "Use either currency_id or currency_code. Defaults to the user's financial administration's currency." + currency_code: + type: string + format: string + example: "EUR" + description: "Use either currency_id or currency_code. Defaults to the user's financial administration's currency." + active: + type: boolean + example: false + default: true + description: "If omitted, defaults to true." + order: + type: integer + format: int32 + example: 1 + description: "Order of the account" + include_net_worth: + type: boolean + example: true + default: true + description: "If omitted, defaults to true." + account_role: + $ref: '#/components/schemas/AccountRoleProperty' + credit_card_type: + $ref: '#/components/schemas/CreditCardTypeProperty' + monthly_payment_date: + nullable: true + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Mandatory when the account_role is ccAsset. Moment at which CC payment installments are asked for by the bank." + liability_type: + $ref: '#/components/schemas/LiabilityTypeProperty' + interest: + type: string + format: string + example: "5.3" + description: "Mandatory when type is liability. Interest percentage." + nullable: true + interest_period: + $ref: '#/components/schemas/InterestPeriodProperty' + notes: + type: string + format: string + nullable: true + example: "Some example notes" + latitude: + type: number + format: double + example: 51.983333 + nullable: true + description: Latitude of the account's location, if applicable. Can be used to draw a map. If omitted, the existing location will be kept. If submitted as NULL, the current location will be removed. + longitude: + type: number + format: double + example: 5.916667 + nullable: true + description: Latitude of the account's location, if applicable. Can be used to draw a map. If omitted, the existing location will be kept. If submitted as NULL, the current location will be removed. + zoom_level: + type: integer + format: int32 + example: 6 + nullable: true + description: Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels. If omitted, the existing location will be kept. If submitted as NULL, the current location will be removed. + ArrayEntryWithCurrencyAndSum: + type: object + properties: + currency_id: + type: string + format: string + example: "5" + currency_code: + type: string + format: string + example: "USD" + currency_symbol: + type: string + format: string + example: "$" + currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimals supported by the currency + sum: + type: string + format: amount + example: "123.45" + description: The amount earned, spent or transferred. + AttachmentProperties: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + attachable_type: + $ref: '#/components/schemas/AttachableType' + attachable_id: + type: string + format: string + example: "134" + description: ID of the model this attachment is linked to. + hash: + type: string + format: string + example: "0c3f95f34370baa88f9fd9a671fea305" + description: Hash of the file for basic duplicate detection. + filename: + type: string + format: string + example: "file.pdf" + download_url: + type: string + format: string + example: "https://demo.firefly-iii.org/api/v1/attachments/191/download" + upload_url: + type: string + format: string + example: "https://demo.firefly-iii.org/api/v1/attachments/191/download" + title: + type: string + format: string + example: "Some PDF file" + nullable: true + notes: + type: string + format: string + example: "Some notes" + nullable: true + mime: + type: string + format: string + example: "application/pdf" + readOnly: true + size: + type: integer + format: int32 + example: 48211 + readOnly: true + AttachmentRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "attachments" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/AttachmentProperties' + links: + $ref: '#/components/schemas/ObjectLink' + AttachmentSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/AttachmentRead' + AttachmentStore: + type: object + required: + - filename + - attachable_type + - attachable_id + properties: + filename: + type: string + format: string + example: "file.pdf" + attachable_type: + $ref: '#/components/schemas/AttachableType' + attachable_id: + type: string + format: string + example: "134" + description: ID of the model this attachment is linked to. + title: + type: string + format: string + example: "Some PDF file" + notes: + type: string + format: string + example: "Some notes" + nullable: true + AttachmentUpdate: + type: object + properties: + filename: + type: string + format: string + example: "file.pdf" + title: + type: string + format: string + example: "Some PDF file" + notes: + type: string + format: string + example: "Some notes" + nullable: true + AvailableBudgetProperties: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + amount: + type: string + format: amount + example: "123.45" + description: "The amount of this available budget in the currency of this available budget." + pc_amount: + type: string + format: amount + example: "123.45" + description: "The amount of this available budget in the primary currency (pc) of this administration." + start: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: Start date of the available budget. + end: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: End date of the available budget. + spent_in_budgets: + type: array + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + readOnly: true + pc_spent_in_budgets: + type: array + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + readOnly: true + description: | + The amount spent in budgets in the primary currency (pc) of this administration. + spent_outside_budgets: + type: array + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + readOnly: true + pc_spent_outside_budgets: + type: array + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + readOnly: true + description: | + The amount spent outside of budgets in the primary currency (pc) of this administration. + AvailableBudgetRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "available_budgets" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/AvailableBudgetProperties' + AvailableBudgetSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/AvailableBudgetRead' + BillProperties: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + name: + type: string + format: string + example: "Rent" + description: "The name of the subscription." + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + amount_min: + type: string + format: amount + example: "123.45" + description: "The minimum amount that is expected for this subscription in the subscription's currency." + pc_amount_min: + type: string + format: amount + example: "123.45" + description: "The minimum amount that is expected for this subscription in the administration's primary currency." + amount_max: + type: string + format: amount + example: "123.45" + description: "The maximum amount that is expected for this subscription in the subscription's currency." + pc_amount_max: + type: string + format: amount + example: "123.45" + description: "The maximum amount that is expected for this subscription in the administration's primary currency." + amount_avg: + type: string + format: amount + example: "123.45" + description: "The average amount that is expected for this subscription in the subscription's currency." + pc_amount_avg: + type: string + format: amount + example: "123.45" + description: "The average amount that is expected for this subscription in the administration's primary currency." + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + end_date: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: "The date after which this subscription is no longer valid or applicable" + nullable: true + extension_date: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: "The date before which the subscription must be renewed (or cancelled)" + nullable: true + repeat_freq: + $ref: '#/components/schemas/BillRepeatFrequency' + skip: + type: integer + format: int32 + example: 0 + description: How often the subscription will be skipped. 1 means a bi-monthly subscription. + active: + type: boolean + example: true + description: If the subscription is active. + order: + type: integer + format: int32 + example: 1 + description: "Order of the subscription." + notes: + type: string + format: string + example: "Some example notes" + nullable: true + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_order: + type: integer + format: int32 + example: 5 + readOnly: true + nullable: true + description: The order of the group. At least 1, for the highest sorting. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + paid_dates: + type: array + description: "Array of past transactions when the subscription was paid." + readOnly: true + items: + type: object + readOnly: true + properties: + transaction_group_id: + type: string + format: string + example: "123" + description: "Transaction group ID of the transaction linked to this subscription." + readOnly: true + transaction_journal_id: + type: string + format: string + example: "123" + description: "Transaction journal ID of the transaction linked to this subscription." + readOnly: true + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Date the bill was paid." + readOnly: true + subscription_id: + type: string + format: string + example: "123" + description: "ID of this subscription." + readOnly: true + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + amount: + type: string + format: amount + example: "123.45" + description: "The amount that was paid for this subscription in the subscription's currency." + pc_amount: + type: string + format: amount + example: "123.45" + description: "The amount that was paid for this subscription in the administration's primary currency." + foreign_amount: + type: string + format: amount + example: "123.45" + description: "The foreign amount that was paid for this subscription in the subscription's currency." + pc_foreign_amount: + type: string + format: amount + example: "123.45" + description: "The foreign amount that was paid for this subscription in the administration's primary currency." + pay_dates: + type: array + description: "Array of future dates when the bill is expected to be paid. Autogenerated." + readOnly: true + items: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + + next_expected_match: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "When the subscription is expected to be due." + nullable: true + readOnly: true + next_expected_match_diff: + type: string + format: string + example: "today" + description: "Formatted (locally) when the subscription is due." + nullable: true + readOnly: true + BillRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "bills" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/BillProperties' + BillSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/BillRead' + BillStore: + type: object + required: + - name + - amount_min + - amount_max + - date + - repeat_freq + properties: + currency_id: + type: string + format: string + example: "5" + description: Use either currency_id or currency_code + currency_code: + type: string + format: string + example: EUR + description: Use either currency_id or currency_code + name: + type: string + format: string + example: "Rent" + amount_min: + type: string + format: amount + example: "123.45" + amount_max: + type: string + format: amount + example: "123.45" + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + end_date: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: "The date after which this bill is no longer valid or applicable" + extension_date: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: "The date before which the bill must be renewed (or cancelled)" + repeat_freq: + $ref: '#/components/schemas/BillRepeatFrequency' + skip: + type: integer + format: int32 + example: 0 + description: How often the bill must be skipped. 1 means a bi-monthly bill. + active: + type: boolean + example: true + description: If the bill is active. + notes: + type: string + format: string + example: "Some example notes" + nullable: true + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + BillUpdate: + type: object + required: + - name + properties: + currency_id: + type: string + format: string + example: "5" + description: Use either currency_id or currency_code + currency_code: + type: string + format: string + example: EUR + description: Use either currency_id or currency_code + name: + type: string + format: string + example: "Rent" + amount_min: + type: string + format: amount + example: "123.45" + amount_max: + type: string + format: amount + example: "123.45" + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + end_date: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: "The date after which this bill is no longer valid or applicable" + extension_date: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: "The date before which the bill must be renewed (or cancelled)" + repeat_freq: + $ref: '#/components/schemas/BillRepeatFrequency' + skip: + type: integer + format: int32 + example: 0 + description: How often the bill must be skipped. 1 means a bi-monthly bill. + active: + type: boolean + example: true + description: If the bill is active. + notes: + type: string + format: string + example: "Some example notes" + nullable: true + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + BudgetProperties: + type: object + required: + - name + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + active: + type: boolean + example: false + name: + type: string + format: string + example: "Bills" + order: + type: integer + format: int32 + example: 5 + readOnly: true + notes: + type: string + format: string + example: "Some notes" + nullable: true + auto_budget_type: + $ref: '#/components/schemas/AutoBudgetType' + auto_budget_period: + $ref: '#/components/schemas/AutoBudgetPeriod' + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_order: + type: integer + format: int32 + example: 5 + readOnly: true + nullable: true + description: The order of the group. At least 1, for the highest sorting. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + auto_budget_amount: + type: string + format: amount + example: "-1012.12" + nullable: true + description: "The amount for the auto-budget, if set." + pc_auto_budget_amount: + type: string + format: amount + example: "-1012.12" + nullable: true + description: "The amount for the auto-budget, if set in the primary currency of the administration." + spent: + description: "Information on how much was spent in this budget. Is only filled in when the start and end date are submitted." + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + pc_spent: + description: "Information on how much was spent in this budget. Is only filled in when the start and end date are submitted. It is converted to the primary currency of the administration." + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + BudgetRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "budgets" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/BudgetProperties' + BudgetSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/BudgetRead' + BudgetStore: + type: object + required: + - name + properties: + name: + type: string + format: string + example: "Bills" + active: + type: boolean + example: false + order: + type: integer + format: int32 + example: 5 + readOnly: true + notes: + type: string + format: string + example: "Some notes" + nullable: true + fire_webhooks: + type: boolean + example: true + default: true + description: "Whether or not to fire the webhooks that are related to this event." + auto_budget_type: + $ref: '#/components/schemas/AutoBudgetType' + auto_budget_currency_id: + type: string + format: string + example: "12" + nullable: true + description: "Use either currency_id or currency_code. Defaults to the user's financial administration's currency." + auto_budget_currency_code: + type: string + format: string + example: "EUR" + nullable: true + description: "Use either currency_id or currency_code. Defaults to the user's financial administration's currency." + auto_budget_amount: + type: string + format: amount + example: "-1012.12" + nullable: true + auto_budget_period: + $ref: '#/components/schemas/AutoBudgetPeriod' + BudgetUpdate: + type: object + required: + - name + properties: + name: + type: string + format: string + example: "Bills" + active: + type: boolean + example: false + order: + type: integer + format: int32 + example: 5 + notes: + type: string + format: string + example: "Some notes" + nullable: true + fire_webhooks: + type: boolean + example: true + default: true + description: "Whether or not to fire the webhooks that are related to this event." + auto_budget_type: + $ref: '#/components/schemas/AutoBudgetType' + auto_budget_currency_id: + type: string + format: string + example: "12" + nullable: true + description: "Use either currency_id or currency_code. Defaults to the user's financial administration's currency." + auto_budget_currency_code: + type: string + format: string + example: "EUR" + nullable: true + description: "Use either currency_id or currency_code. Defaults to the user's financial administration's currency." + auto_budget_amount: + type: string + format: amount + example: "-1012.12" + nullable: true + auto_budget_period: + $ref: '#/components/schemas/AutoBudgetPeriod' + BudgetLimitProperties: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + start: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: Start date of the budget limit. + end: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: End date of the budget limit. + budget_id: + type: string + format: string + example: "23" + description: The budget ID of the associated budget. + readOnly: true + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + amount: + type: string + format: amount + example: "123.45" + pc_amount: + type: string + format: amount + example: "123.45" + nullable: true + readOnly: true + description: "The amount of this budget limit in the user's primary currency, if the original amount is in a different currency." + period: + type: string + format: string + example: "monthly" + nullable: true + readOnly: true + description: Period of the budget limit. Only used when auto-generated by auto-budget. + spent: + description: "Amount(s) spent in the currencies in the database for this budget limit." + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + pc_spent: + description: "Amount(s) spent in the primary currency in the database for this budget limit." + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + notes: + type: string + format: string + example: "Some example notes" + nullable: true + description: Some notes for this specific budget limit. + BudgetLimitRead: + type: object + required: + - type + - id + - attributes + properties: + type: + type: string + format: string + example: "budget_limits" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/BudgetLimitProperties' + BudgetLimitSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/BudgetLimitRead' + BudgetLimitStore: + type: object + required: + - amount + - start + - end + - budget_id + properties: + currency_id: + type: string + format: string + example: "5" + description: Use either currency_id or currency_code. Defaults to the user's primary currency. + currency_code: + type: string + format: string + example: EUR + description: Use either currency_id or currency_code. Defaults to the user's primary currency. + budget_id: + type: string + format: string + example: "23" + description: The budget ID of the associated budget. + readOnly: true + start: + type: string + format: date + example: "2026-10-01" + description: Start date of the budget limit. + period: + type: string + format: string + example: "monthly" + nullable: true + readOnly: true + description: Period of the budget limit. Only used when auto-generated by auto-budget. + end: + type: string + format: date + example: "2026-10-31" + description: End date of the budget limit. + amount: + type: string + format: amount + example: "123.45" + notes: + type: string + format: string + example: "Some example notes" + nullable: true + description: Some notes for this specific budget limit. + fire_webhooks: + type: boolean + example: true + default: true + description: "Whether or not to fire the webhooks that are related to this event." + BudgetLimitUpdate: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + start: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: Start date of the budget limit. + end: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + description: End date of the budget limit. + budget_id: + type: string + format: string + example: "23" + description: The budget ID of the associated budget. + readOnly: true + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + period: + type: string + format: string + example: "monthly" + nullable: true + readOnly: true + description: Period of the budget limit. Only used when auto-generated by auto-budget. + amount: + type: string + format: amount + example: "123.45" + pc_amount: + type: string + format: amount + example: "123.45" + nullable: true + readOnly: true + description: "The amount of this budget limit in the user's primary currency, if the original amount is in a different currency." + spent: + type: string + format: amount + example: "-1012.12" + nullable: true + readOnly: true + description: "Will be in the primary currency if this is turned on by the user." + notes: + type: string + format: string + example: "Some example notes" + nullable: true + description: Some notes for this specific budget limit. + fire_webhooks: + type: boolean + example: true + default: true + description: "Whether or not to fire the webhooks that are related to this event." + CategoryProperties: + type: object + required: + - name + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + name: + type: string + format: string + example: "Lunch" + color: + type: string + format: string + example: "FF0000" + description: "The color of the category in HEX format. Firefly III does not use this field, but your app might." + last_activity: + nullable: true + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Last activity of the category." + notes: + type: string + format: string + nullable: true + example: "Some example notes" + object_has_currency_setting: + type: boolean + example: false + readOnly: false + description: "This object never has its own currency setting, so this value is always false." + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + spent: + description: "Amount(s) spent in the currencies in the database for this category. ONLY present when start and date are set." + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + pc_spent: + description: "Amount(s) spent in the primary currency in the database for this category. ONLY present when start and date are set. " + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + earned: + description: "Amount(s) earned in the currencies in the database for this category. ONLY present when start and date are set." + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + pc_earned: + description: "Amount(s) earned in the primary currency in the database for this category. ONLY present when start and date are set. " + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + transferred: + description: "Amount(s) transferred in the currencies in the database for this category. ONLY present when start and date are set. " + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + pc_transferred: + description: "Amount(s) transferred in primary currency in the database for this category. ONLY present when start and date are set. " + type: array + readOnly: true + items: + $ref: '#/components/schemas/ArrayEntryWithCurrencyAndSum' + CategoryStore: + type: object + required: + - name + properties: + name: + type: string + format: string + example: "Lunch" + notes: + type: string + format: string + nullable: true + example: "Some example notes" + color: + type: string + format: string + nullable: true + example: "FF0000" + description: "The color of the category in HEX format. Firefly III does not use this field, but your app might." + CategoryUpdate: + type: object + required: + - name + properties: + name: + type: string + format: string + example: "Lunch" + notes: + type: string + format: string + nullable: true + example: "Some example notes" + color: + type: string + format: string + nullable: true + example: "FF0000" + description: "The color of the category in HEX format. Firefly III does not use this field, but your app might." + CurrencyExchangeProperties: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + from_currency_id: + type: string + format: string + example: "12" + readOnly: true + description: "Base currency ID for this exchange rate entry." + from_currency_name: + type: string + format: string + example: "Euro" + readOnly: true + description: "Base currency name for this exchange rate entry." + from_currency_code: + type: string + format: string + example: "EUR" + readOnly: true + description: "Base currency code for this exchange rate entry." + from_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "Base currency symbol for this exchange rate entry." + from_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "Base currency decimal places for this exchange rate entry." + to_currency_id: + type: string + format: string + example: "12" + readOnly: true + description: "Destination currency ID for this exchange rate entry." + to_currency_name: + type: string + format: string + example: "EUR" + readOnly: true + description: "Destination currency name for this exchange rate entry." + to_currency_code: + type: string + format: string + example: "EUR" + readOnly: true + description: "Destination currency code for this exchange rate entry." + to_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "Destination currency symbol for this exchange rate entry." + to_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "Destination currency decimal places for this exchange rate entry." + rate: + type: string + format: string + example: "1.10340" + readOnly: true + description: "The actual exchange rate. How many 'to' currency will you get for 1 'from' currency?" + date: + type: string + format: date-time + readOnly: true + example: "2026-10-01T00:00:00+00:00" + description: "Date and time of the exchange rate." + CurrencyExchangeRateRead: + type: object + properties: + type: + type: string + format: string + readOnly: true + example: "currency_exchange_rates" + description: "Immutable value" + id: + type: string + readOnly: true + format: string + example: "2" + attributes: + $ref: '#/components/schemas/CurrencyExchangeProperties' + links: + $ref: '#/components/schemas/ObjectLink' + CurrencyExchangeRateSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/CurrencyExchangeRateRead' + CurrencyExchangeRateStore: + type: object + required: + - date + - from + - to + - rates + properties: + date: + type: string + format: date + example: "2026-10-01" + description: "The date to which the exchange rate is applicable." + nullable: false + from: + type: string + format: string + example: "USD" + description: "The base currency code." + nullable: false + to: + type: string + format: string + example: "EUR" + description: "The destination currency code." + nullable: false + rate: + type: string + format: string + nullable: false + example: "2.3456" + description: "The exchange rate from the base currency to the destination currency." + CurrencyExchangeRateStoreByDate: + type: object + required: + - from + - date + - rates + properties: + from: + type: string + format: string + example: "EUR" + description: "The 'from'-currency" + rates: + type: object + description: "The actual entries for this data set. They 'key' value is 'to' currency. The value is the exchange rate." + additionalProperties: + type: string + example: + USD: '1.2345' + GBP: '6.3456' + CurrencyExchangeRateStoreByPair: + type: object + description: "The actual entries for this data set. They 'key' value is the date in YYYY-MM-DD. The value is the exchange rate." + additionalProperties: + type: string + example: + "2025-08-01": "1.2345" + "2025-08-02": "6.3456" + CurrencyExchangeRateUpdate: + type: object + required: + - date + - rate + properties: + date: + type: string + format: date + example: "2026-10-01" + description: The date to which the exchange rate is applicable. + nullable: false + rate: + type: string + format: string + nullable: false + example: "2.3456" + description: "The exchange rate from the base currency to the destination currency." + from: + type: string + format: string + example: "USD" + description: "The base currency code." + nullable: true + to: + type: string + format: string + example: "EUR" + description: "The destination currency code." + nullable: true + CurrencyExchangeRateUpdateNoDate: + type: object + required: + - rate + properties: + rate: + type: string + format: string + nullable: false + example: "2.3456" + description: "The exchange rate from the base currency to the destination currency." + ObjectGroup: + type: object + required: + - title + - order + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + title: + type: string + format: string + example: "My object group" + order: + type: integer + format: int32 + example: 1 + description: "Order of the object group" + ObjectGroupUpdate: + type: object + required: + - title + properties: + title: + type: string + format: string + example: "My object group" + order: + type: integer + format: int32 + example: 1 + description: "Order of the object group" + ObjectLink: + type: object + properties: + self: + type: string + format: uri + example: "https://demo.firefly-iii.org/api/v1/OBJECTS/1" + "0": + type: object + properties: + rel: + type: string + format: string + example: "self" + uri: + type: string + format: string + example: "/OBJECTS/1" + PageLink: + type: object + properties: + self: + type: string + format: uri + example: "https://demo.firefly-iii.org/api/v1/OBJECT?&page=4" + first: + type: string + format: uri + example: "https://demo.firefly-iii.org/api/v1/OBJECT?&page=1" + next: + type: string + format: uri + example: "https://demo.firefly-iii.org/api/v1/OBJECT?&page=3" + nullable: true + prev: + type: string + format: uri + example: "https://demo.firefly-iii.org/api/v1/OBJECT?&page=2" + nullable: true + last: + type: string + format: uri + example: "https://demo.firefly-iii.org/api/v1/OBJECT?&page=12" + PiggyBankAccountRead: + type: object + properties: + account_id: + type: string + format: string + example: "3" + readOnly: true + nullable: false + description: "The ID of the account." + name: + type: string + format: string + readOnly: true + nullable: false + example: "Checking account" + current_amount: + type: string + format: amount + example: "123.45" + pc_current_amount: + type: string + format: amount + example: "123.45" + description: "If convertToPrimary is on, this will show the amount in the primary currency." + PiggyBankAccountStore: + type: object + required: + - id + properties: + id: + type: string + format: string + example: "3" + nullable: true + description: "The ID of the account." + name: + type: string + format: string + nullable: true + example: "Checking account" + description: "The name of the account." + current_amount: + type: string + format: amount + example: "123.45" + description: "The amount saved currently." + PiggyBankAccountUpdate: + type: object + required: + - id + properties: + account_id: + type: string + format: string + example: "3" + nullable: true + description: "The ID of the account." + name: + type: string + format: string + nullable: true + example: "Checking account" + description: "The name of the account." + current_amount: + type: string + format: amount + nullable: true + example: "123.45" + description: "The amount saved currently." + PiggyBankProperties: + type: object + required: + - name + - account_id + - target_amount + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + name: + type: string + format: string + example: "New digital camera" + percentage: + type: integer + format: int32 + nullable: true + example: 12 + readOnly: true + description: "The percentage of the target amount that has been saved, if a target amount is set." + start_date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "The date you started with this piggy bank." + target_date: + type: string + nullable: true + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "The date you intend to finish saving money." + order: + type: integer + format: int32 + example: 5 + active: + type: boolean + example: true + readOnly: true + notes: + type: string + format: string + nullable: true + example: "Some notes" + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_order: + type: integer + format: int32 + example: 5 + readOnly: true + nullable: true + description: The order of the group. At least 1, for the highest sorting. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + accounts: + type: array + items: + $ref: '#/components/schemas/PiggyBankAccountRead' + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + target_amount: + type: string + format: amount + nullable: true + example: "123.45" + pc_target_amount: + type: string + format: amount + nullable: true + example: "123.45" + description: "The target amount in the primary currency of the administration." + current_amount: + type: string + format: amount + example: "123.45" + pc_current_amount: + type: string + format: amount + example: "123.45" + description: "The current amount in the primary currency of the administration." + left_to_save: + type: string + nullable: true + format: string + example: "700.00" + pc_left_to_save: + type: string + nullable: true + format: string + example: "700.00" + save_per_month: + type: string + nullable: true + format: string + example: "12.45" + readOnly: true + pc_save_per_month: + type: string + nullable: true + format: string + example: "12.45" + readOnly: true + PiggyBankStore: + type: object + required: + - name + - account_id + - target_amount + - start_date + properties: + name: + type: string + format: string + example: "New digital camera" + accounts: + type: array + items: + $ref: '#/components/schemas/PiggyBankAccountStore' + target_amount: + type: string + format: amount + example: "123.45" + nullable: true + current_amount: + type: string + format: amount + example: "123.45" + start_date: + type: string + format: date + example: "2026-10-01" + description: The date you started with this piggy bank. + target_date: + type: string + format: date + nullable: true + example: "2026-10-31" + description: The date you intend to finish saving money. + order: + type: integer + format: int32 + example: 5 + active: + type: boolean + example: true + readOnly: true + notes: + type: string + format: string + nullable: true + example: "Some notes" + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + PiggyBankUpdate: + type: object + properties: + name: + type: string + format: string + example: "New digital camera" + accounts: + type: array + items: + $ref: '#/components/schemas/PiggyBankAccountUpdate' + currency_id: + type: string + format: string + example: "5" + readOnly: true + currency_code: + type: string + format: string + example: "USD" + readOnly: true + target_amount: + type: string + nullable: true + format: amount + example: "123.45" + start_date: + type: string + format: date + example: "2026-10-01" + description: The date you started with this piggy bank. + target_date: + type: string + format: date + nullable: true + example: "2026-10-31" + description: The date you intend to finish saving money. + order: + type: integer + format: int32 + example: 5 + active: + type: boolean + example: true + readOnly: true + notes: + type: string + format: string + nullable: true + example: "Some notes" + object_group_id: + type: string + format: string + example: "5" + nullable: true + description: The group ID of the group this object is part of. NULL if no group. + object_group_title: + type: string + format: string + example: "Example Group" + nullable: true + description: The name of the group. NULL if no group. + PiggyBankEventProperties: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + amount: + type: string + format: amount + example: "123.45" + pc_amount: + type: string + format: amount + example: "123.45" + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + transaction_journal_id: + type: string + format: string + example: "4291" + description: The journal associated with the event. + nullable: true + transaction_group_id: + type: string + format: string + example: "4291" + description: The transaction group associated with the event. + nullable: true + Preference: + type: object + required: + - name + - data + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + name: + type: string + format: string + example: currencyPreference + data: + $ref: '#/components/schemas/PolymorphicProperty' + PreferenceUpdate: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/PolymorphicProperty' + RecurrenceProperties: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + type: + $ref: '#/components/schemas/RecurrenceTransactionType' + title: + type: string + format: string + example: "Rent" + description: + type: string + format: string + example: "Recurring transaction for the monthly rent" + description: Not to be confused with the description of the actual transaction(s) being created. + first_date: + type: string + format: date + example: "2026-10-31" + description: "First time the recurring transaction will fire. Must be after today." + latest_date: + type: string + format: date + example: "2026-10-01" + description: "Last time the recurring transaction has fired." + nullable: true + readOnly: true + repeat_until: + type: string + format: date + example: "2026-10-31" + description: "Date until the recurring transaction can fire. Use either this field or repetitions." + nullable: true + apply_rules: + type: boolean + example: true + description: "Whether or not to fire the rules after the creation of a transaction." + active: + type: boolean + example: true + description: If the recurrence is even active. + nr_of_repetitions: + type: integer + format: int32 + example: 5 + description: Max number of created transactions. Use either this field or repeat_until. + nullable: true + notes: + type: string + format: string + example: "Some notes" + nullable: true + repetitions: + type: array + items: + $ref: '#/components/schemas/RecurrenceRepetition' + transactions: + type: array + items: + $ref: '#/components/schemas/RecurrenceTransaction' + RecurrenceStore: + type: object + required: + - type + - title + - first_date + - repeat_until + - repetitions + - transactions + properties: + type: + $ref: '#/components/schemas/RecurrenceTransactionType' + title: + type: string + format: string + example: "Rent" + description: + type: string + format: string + example: "Recurring transaction for the monthly rent" + description: Not to be confused with the description of the actual transaction(s) being created. + first_date: + type: string + format: date + example: "2026-10-31" + description: "First time the recurring transaction will fire. Must be after today." + repeat_until: + type: string + format: date + example: "2026-10-31" + description: "Date until the recurring transaction can fire. Use either this field or repetitions." + nullable: true + nr_of_repetitions: + type: integer + format: int32 + example: 5 + description: Max number of created transactions. Use either this field or repeat_until. + nullable: true + apply_rules: + type: boolean + example: true + description: "Whether or not to fire the rules after the creation of a transaction." + active: + type: boolean + example: true + description: If the recurrence is even active. + notes: + type: string + format: string + example: "Some notes" + nullable: true + repetitions: + type: array + items: + $ref: '#/components/schemas/RecurrenceRepetitionStore' + transactions: + type: array + items: + $ref: '#/components/schemas/RecurrenceTransactionStore' + RecurrenceUpdate: + type: object + properties: + title: + type: string + format: string + example: "Rent" + description: + type: string + format: string + example: "Recurring transaction for the monthly rent" + description: Not to be confused with the description of the actual transaction(s) being created. + first_date: + type: string + format: date + example: "2026-10-31" + description: "First time the recurring transaction will fire." + repeat_until: + type: string + format: date + example: "2026-10-31" + description: Date until when the recurring transaction can fire. After that date, it's basically inactive. Use either this field or repetitions. + nullable: true + nr_of_repetitions: + type: integer + format: int32 + example: 5 + description: Max number of created transactions. Use either this field or repeat_until. + nullable: true + apply_rules: + type: boolean + example: true + description: "Whether or not to fire the rules after the creation of a transaction." + active: + type: boolean + example: true + description: If the recurrence is even active. + notes: + type: string + format: string + example: "Some notes" + nullable: true + repetitions: + type: array + items: + $ref: '#/components/schemas/RecurrenceRepetitionUpdate' + transactions: + type: array + items: + $ref: '#/components/schemas/RecurrenceTransactionUpdate' + RecurrenceRepetition: + type: object + required: + - type + - moment + properties: + id: + type: string + format: string + example: "2" + readOnly: true + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + type: + $ref: '#/components/schemas/RecurrenceRepetitionType' + moment: + type: string + format: string + example: "3" + description: | + Information that defined the type of repetition. + - For 'daily', this is empty. + - For 'weekly', it is day of the week between 1 and 7 (Monday - Sunday). + - For 'ndom', it is '1,2' or '4,5' or something else, where the first number is the week in the month, and the second number is the day in the week (between 1 and 7). '2,3' means: the 2nd Wednesday of the month + - For 'monthly' it is the day of the month (1 - 31) + - For yearly, it is a full date, ie '2026-10-01'. The year you use does not matter. + skip: + type: integer + format: int32 + example: 0 + description: How many occurrences to skip. 0 means skip nothing. 1 means every other. + weekend: + type: integer + format: int32 + example: 1 + description: | + How to respond when the recurring transaction falls in the weekend. Possible values: + 1. Do nothing, just create it + 2. Create no transaction. + 3. Skip to the previous Friday. + 4. Skip to the next Monday. + description: + type: string + format: string + example: "Every week on Friday" + description: Auto-generated repetition description. + readOnly: true + occurrences: + type: array + description: "Array of future dates when the repetition will apply to. Auto generated." + readOnly: true + items: + type: string + format: date-time + example: "2026-10-31T23:59:59+00:00" + RecurrenceRepetitionStore: + type: object + required: + - type + - moment + properties: + type: + $ref: '#/components/schemas/RecurrenceRepetitionType' + moment: + type: string + format: string + example: "3" + description: | + Information that defined the type of repetition. + - For 'daily', this is empty. + - For 'weekly', it is day of the week between 1 and 7 (Monday - Sunday). + - For 'ndom', it is '1,2' or '4,5' or something else, where the first number is the week in the month, and the second number is the day in the week (between 1 and 7). '2,3' means: the 2nd Wednesday of the month + - For 'monthly' it is the day of the month (1 - 31) + - For yearly, it is a full date, ie '2026-10-01'. The year you use does not matter. + skip: + type: integer + format: int32 + example: 0 + description: How many occurrences to skip. 0 means skip nothing. 1 means every other. + weekend: + type: integer + format: int32 + example: 1 + description: | + How to respond when the recurring transaction falls in the weekend. Possible values: + 1. Do nothing, just create it + 2. Create no transaction. + 3. Skip to the previous Friday. + 4. Skip to the next Monday. + RecurrenceRepetitionUpdate: + type: object + properties: + type: + $ref: '#/components/schemas/RecurrenceRepetitionType' + moment: + type: string + format: string + example: "3" + description: | + Information that defined the type of repetition. + - For 'daily', this is empty. + - For 'weekly', it is day of the week between 1 and 7 (Monday - Sunday). + - For 'ndom', it is '1,2' or '4,5' or something else, where the first number is the week in the month, and the second number is the day in the week (between 1 and 7). '2,3' means: the 2nd Wednesday of the month + - For 'monthly' it is the day of the month (1 - 31) + - For yearly, it is a full date, ie '2026-10-01'. The year you use does not matter. + skip: + type: integer + format: int32 + example: 0 + description: How many occurrences to skip. 0 means skip nothing. 1 means every other. + weekend: + type: integer + format: int32 + example: 1 + description: | + How to respond when the recurring transaction falls in the weekend. Possible values: + 1. Do nothing, just create it + 2. Create no transaction. + 3. Skip to the previous Friday. + 4. Skip to the next Monday. + RecurrenceTransaction: + type: object + required: + - description + - amount + properties: + id: + type: string + format: string + example: "ID of the recurring transaction. Not to be confused with the ID of the recurrence itself." + description: + type: string + format: string + example: "Rent for the current month" + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the currency associated with this object." + currency_name: + type: string + format: string + example: Euro + description: "The currency name of the currency associated with this object." + currency_code: + type: string + format: string + example: EUR + description: "The currency code of the currency associated with this object." + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + primary_currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the administration's primary currency." + readOnly: true + primary_currency_name: + type: string + format: string + example: Euro + readOnly: true + description: "The currency name of the administration's primary currency." + primary_currency_code: + type: string + format: string + example: EUR + readOnly: true + description: "The currency code of the administration's primary currency." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "The currency symbol of the administration's primary currency." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "The currency decimal places of the administration's primary currency." + amount: + type: string + format: amount + example: "123.45" + description: Amount of the transaction. + pc_amount: + type: string + format: amount + example: "123.45" + description: Amount of the transaction in primary currency. + foreign_amount: + type: string + format: amount + example: "123.45" + description: Foreign amount of the transaction. + nullable: true + pc_foreign_amount: + type: string + format: amount + example: "123.45" + description: Foreign amount of the transaction. + nullable: true + foreign_currency_id: + type: string + format: string + example: "17" + nullable: true + foreign_currency_name: + type: string + format: string + example: "British Pound" + nullable: true + foreign_currency_code: + type: string + format: string + example: "GBP" + nullable: true + foreign_currency_symbol: + type: string + format: string + example: "$" + nullable: true + readOnly: true + foreign_currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimals in the currency + nullable: true + readOnly: true + budget_id: + type: string + format: string + example: "4" + description: The budget ID for this transaction. + budget_name: + type: string + format: string + example: Groceries + description: The name of the budget to be used. If the budget name is unknown, the ID will be used or the value will be ignored. + nullable: true + readOnly: true + category_id: + type: string + format: string + description: Category ID for this transaction. + example: "211" + category_name: + type: string + format: string + description: Category name for this transaction. + example: "Bills" + source_id: + type: string + format: string + example: "913" + description: ID of the source account. Submit either this or source_name. + source_name: + type: string + format: string + example: "Checking account" + description: Name of the source account. Submit either this or source_id. + source_iban: + type: string + format: string + example: "NL02ABNA0123456789" + nullable: true + readOnly: true + source_type: + $ref: '#/components/schemas/AccountTypeProperty' + destination_id: + type: string + format: string + example: "258" + description: ID of the destination account. Submit either this or destination_name. + destination_name: + type: string + format: string + example: "Buy and Large" + description: Name of the destination account. Submit either this or destination_id. + destination_iban: + type: string + format: string + example: "NL02ABNA0123456789" + nullable: true + readOnly: true + destination_type: + $ref: '#/components/schemas/AccountTypeProperty' + tags: + type: array + nullable: true + example: + description: Array of tags. + items: + type: string + format: string + description: Tag. + example: Barbecue preparation + piggy_bank_id: + type: string + format: string + example: "123" + nullable: true + piggy_bank_name: + type: string + format: string + nullable: true + subscription_id: + type: string + format: string + example: "123" + nullable: true + subscription_name: + type: string + format: string + nullable: true + RecurrenceTransactionStore: + type: object + required: + - description + - amount + - source_id + - destination_id + properties: + description: + type: string + format: string + example: "Rent for the current month" + amount: + type: string + format: amount + example: "123.45" + description: Amount of the transaction. + foreign_amount: + type: string + format: amount + example: "123.45" + description: Foreign amount of the transaction. + nullable: true + currency_id: + type: string + format: string + example: "3" + description: Submit either a currency_id or a currency_code. + currency_code: + type: string + format: string + example: "EUR" + description: Submit either a currency_id or a currency_code. + foreign_currency_id: + type: string + format: string + example: "17" + nullable: true + description: Submit either a foreign_currency_id or a foreign_currency_code, or neither. + foreign_currency_code: + type: string + format: string + example: "GBP" + nullable: true + description: Submit either a foreign_currency_id or a foreign_currency_code, or neither. + budget_id: + type: string + format: string + example: "4" + description: The budget ID for this transaction. + category_id: + type: string + format: string + description: Category ID for this transaction. + example: "211" + source_id: + type: string + format: string + example: "913" + description: ID of the source account. + destination_id: + type: string + format: string + example: "258" + description: ID of the destination account. + tags: + type: array + nullable: true + example: + description: Array of tags. + items: + type: string + format: string + description: Tag. + example: Barbecue preparation + piggy_bank_id: + type: string + format: string + example: "123" + nullable: true + description: Optional. + bill_id: + type: string + format: string + example: "123" + nullable: true + description: Optional. + RecurrenceTransactionUpdate: + type: object + required: + - id + properties: + id: + type: string + format: string + example: "ID of the recurring transaction. Not to be confused with the ID of the recurrence itself. Is marked as REQUIRED but can be skipped when there is only ONE transaction." + description: + type: string + format: string + example: "Rent for the current month" + amount: + type: string + format: amount + example: "123.45" + description: Amount of the transaction. + foreign_amount: + type: string + format: amount + example: "123.45" + description: Foreign amount of the transaction. + nullable: true + currency_id: + type: string + format: string + example: "3" + description: Submit either a currency_id or a currency_code. + currency_code: + type: string + format: string + example: "EUR" + description: Submit either a currency_id or a currency_code. + foreign_currency_id: + type: string + format: string + example: "17" + nullable: true + description: Submit either a foreign_currency_id or a foreign_currency_code, or neither. + budget_id: + type: string + format: string + example: "4" + description: The budget ID for this transaction. + category_id: + type: string + format: string + description: Category ID for this transaction. + example: "211" + source_id: + type: string + format: string + example: "913" + description: ID of the source account. Submit either this or source_name. + destination_id: + type: string + format: string + example: "258" + description: ID of the destination account. Submit either this or destination_name. + tags: + type: array + nullable: true + example: + description: Array of tags. + items: + type: string + format: string + description: Tag. + example: Barbecue preparation + piggy_bank_id: + type: string + format: string + example: "123" + nullable: true + bill_id: + type: string + format: string + example: "123" + nullable: true + description: Optional. + Rule: + type: object + required: + - title + - rule_group_id + - trigger + - triggers + - actions + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + title: + type: string + format: string + example: "First rule title." + description: + type: string + format: string + example: "First rule description" + rule_group_id: + type: string + format: string + example: "81" + description: "ID of the rule group under which the rule must be stored. Either this field or rule_group_title is mandatory." + rule_group_title: + type: string + format: string + example: "New rule group" + description: "Title of the rule group under which the rule must be stored. Either this field or rule_group_id is mandatory." + order: + type: integer + format: int32 + example: 5 + readOnly: true + trigger: + $ref: '#/components/schemas/RuleTriggerType' + active: + type: boolean + example: true + default: true + description: Whether or not the rule is even active. Default is true. + strict: + type: boolean + example: true + description: If the rule is set to be strict, ALL triggers must hit in order for the rule to fire. Otherwise, just one is enough. Default value is true. + stop_processing: + type: boolean + example: false + default: false + description: If this value is true and the rule is triggered, other rules after this one in the group will be skipped. Default value is false. + triggers: + type: array + items: + $ref: '#/components/schemas/RuleTrigger' + actions: + type: array + items: + $ref: '#/components/schemas/RuleAction' + RuleStore: + type: object + required: + - title + - rule_group_id + - trigger + - triggers + - actions + properties: + title: + type: string + format: string + example: "First rule title." + description: + type: string + format: string + example: "First rule description" + rule_group_id: + type: string + format: string + example: "81" + description: "ID of the rule group under which the rule must be stored. Either this field or rule_group_title is mandatory." + rule_group_title: + type: string + format: string + example: "New rule group" + description: "Title of the rule group under which the rule must be stored. Either this field or rule_group_id is mandatory." + order: + type: integer + format: int32 + example: 5 + trigger: + $ref: '#/components/schemas/RuleTriggerType' + active: + type: boolean + example: true + default: true + description: Whether or not the rule is even active. Default is true. + strict: + type: boolean + example: true + default: true + description: If the rule is set to be strict, ALL triggers must hit in order for the rule to fire. Otherwise, just one is enough. Default value is true. + stop_processing: + type: boolean + example: false + description: If this value is true and the rule is triggered, other rules after this one in the group will be skipped. Default value is false. + triggers: + type: array + items: + $ref: '#/components/schemas/RuleTriggerStore' + actions: + type: array + items: + $ref: '#/components/schemas/RuleActionStore' + RuleUpdate: + type: object + properties: + title: + type: string + format: string + example: "First rule title." + description: + type: string + format: string + example: "First rule description" + rule_group_id: + type: string + format: string + example: "81" + description: "ID of the rule group under which the rule must be stored. Either this field or rule_group_title is mandatory." + order: + type: integer + format: int32 + example: 5 + trigger: + $ref: '#/components/schemas/RuleTriggerType' + active: + type: boolean + example: true + default: true + description: Whether or not the rule is even active. Default is true. + strict: + type: boolean + example: true + description: If the rule is set to be strict, ALL triggers must hit in order for the rule to fire. Otherwise, just one is enough. Default value is true. + stop_processing: + type: boolean + example: false + default: false + description: If this value is true and the rule is triggered, other rules after this one in the group will be skipped. Default value is false. + triggers: + type: array + items: + $ref: '#/components/schemas/RuleTriggerUpdate' + actions: + type: array + items: + $ref: '#/components/schemas/RuleActionUpdate' + RuleAction: + type: object + required: + - type + - value + properties: + id: + type: string + format: string + example: "2" + readOnly: true + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + type: + $ref: '#/components/schemas/RuleActionKeyword' + value: + type: string + format: string + example: "Daily groceries" + nullable: true + description: "The accompanying value the action will set, change or update. Can be empty, but for some types this value is mandatory." + order: + type: integer + format: int32 + example: 5 + description: "Order of the action" + active: + type: boolean + example: true + default: true + description: If the action is active. Defaults to true. + stop_processing: + type: boolean + example: false + default: false + description: When true, other actions will not be fired after this action has fired. Defaults to false. + RuleActionStore: + type: object + required: + - type + - value + properties: + type: + $ref: '#/components/schemas/RuleActionKeyword' + value: + type: string + format: string + example: "Daily groceries" + nullable: true + description: "The accompanying value the action will set, change or update. Can be empty, but for some types this value is mandatory." + order: + type: integer + format: int32 + example: 5 + description: "Order of the action" + active: + type: boolean + example: true + default: true + description: If the action is active. Defaults to true. + stop_processing: + type: boolean + example: false + default: false + description: When true, other actions will not be fired after this action has fired. Defaults to false. + RuleActionUpdate: + type: object + properties: + type: + $ref: '#/components/schemas/RuleActionKeyword' + value: + type: string + format: string + example: "Daily groceries" + nullable: true + description: "The accompanying value the action will set, change or update. Can be empty, but for some types this value is mandatory." + order: + type: integer + format: int32 + example: 5 + description: "Order of the action" + active: + type: boolean + example: true + description: If the action is active. + stop_processing: + type: boolean + example: false + description: When true, other actions will not be fired after this action has fired. + RuleGroup: + type: object + required: + - title + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + title: + type: string + format: string + example: "Default rule group" + description: + type: string + format: string + example: "Description of this rule group" + nullable: true + order: + type: integer + format: int32 + example: 4 + readOnly: true + active: + type: boolean + example: true + RuleGroupStore: + type: object + required: + - title + properties: + title: + type: string + format: string + example: "Default rule group" + description: + type: string + format: string + example: "Description of this rule group" + nullable: true + order: + type: integer + format: int32 + example: 4 + active: + type: boolean + example: true + RuleGroupUpdate: + type: object + properties: + title: + type: string + format: string + example: "Default rule group" + description: + type: string + format: string + example: "Description of this rule group" + nullable: true + order: + type: integer + format: int32 + example: 4 + active: + type: boolean + example: true + RuleTrigger: + type: object + required: + - type + - value + properties: + id: + type: string + format: string + example: "2" + readOnly: true + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + type: + $ref: '#/components/schemas/RuleTriggerKeyword' + value: + type: string + format: string + example: "tag1" + description: "The accompanying value the trigger responds to. This value is often mandatory, but this depends on the trigger." + prohibited: + type: boolean + example: false + default: false + description: If 'prohibited' is true, this rule trigger will be negated. 'Description is' will become 'Description is NOT' etc. + order: + type: integer + format: int32 + example: 5 + description: "Order of the trigger" + readOnly: true + active: + type: boolean + example: true + default: true + description: If the trigger is active. Defaults to true. + stop_processing: + type: boolean + example: false + default: false + description: When true, other triggers will not be checked if this trigger was triggered. Defaults to false. + RuleTriggerStore: + type: object + required: + - type + - value + properties: + type: + $ref: '#/components/schemas/RuleTriggerKeyword' + value: + type: string + format: string + example: "tag1" + description: "The accompanying value the trigger responds to. This value is often mandatory, but this depends on the trigger." + order: + type: integer + format: int32 + example: 5 + description: "Order of the trigger" + active: + type: boolean + example: true + default: true + description: If the trigger is active. Defaults to true. + prohibited: + type: boolean + example: false + default: false + description: If 'prohibited' is true, this rule trigger will be negated. 'Description is' will become 'Description is NOT' etc. + stop_processing: + type: boolean + example: false + default: false + description: When true, other triggers will not be checked if this trigger was triggered. Defaults to false. + RuleTriggerUpdate: + type: object + properties: + type: + $ref: '#/components/schemas/RuleTriggerKeyword' + value: + type: string + format: string + example: "tag1" + description: "The accompanying value the trigger responds to. This value is often mandatory, but this depends on the trigger. If the rule trigger is something like 'has any tag', submit the string 'true'." + order: + type: integer + format: int32 + example: 5 + description: "Order of the trigger" + active: + type: boolean + example: true + description: If the trigger is active. + stop_processing: + type: boolean + example: false + description: When true, other triggers will not be checked if this trigger was triggered. + TagModel: + title: "A single tag (C)" + type: object + required: + - tag + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + tag: + type: string + format: string + example: "expensive" + description: The tag + date: + type: string + format: date + example: "2026-10-01" + description: The date to which the tag is applicable. + nullable: true + description: + type: string + format: string + example: "Tag for expensive stuff" + nullable: true + latitude: + type: number + format: double + example: 51.983333 + nullable: true + description: Latitude of the tag's location, if applicable. Can be used to draw a map. + longitude: + type: number + format: double + example: 5.916667 + nullable: true + description: Latitude of the tag's location, if applicable. Can be used to draw a map. + zoom_level: + type: integer + format: int32 + example: 6 + nullable: true + description: "Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels." + TagModelStore: + title: "A single tag (A)" + type: object + required: + - tag + properties: + tag: + type: string + format: string + example: "expensive" + description: The tag + date: + type: string + format: date + example: "2026-10-01" + description: The date to which the tag is applicable. + nullable: true + description: + type: string + format: string + example: "Tag for expensive stuff" + nullable: true + latitude: + type: number + format: double + example: 51.983333 + nullable: true + description: Latitude of the tag's location, if applicable. Can be used to draw a map. + longitude: + type: number + format: double + example: 5.916667 + nullable: true + description: Latitude of the tag's location, if applicable. Can be used to draw a map. + zoom_level: + type: integer + format: int32 + example: 6 + nullable: true + description: "Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels." + TagModelUpdate: + title: "A single tag (B)" + type: object + properties: + tag: + type: string + format: string + example: "expensive" + description: The tag + date: + type: string + format: date + example: "2026-10-01" + description: The date to which the tag is applicable. + nullable: true + description: + type: string + format: string + example: "Tag for expensive stuff" + nullable: true + latitude: + type: number + format: double + example: 51.983333 + nullable: true + description: Latitude of the tag's location, if applicable. Can be used to draw a map. + longitude: + type: number + format: double + example: 5.916667 + nullable: true + description: Latitude of the tag's location, if applicable. Can be used to draw a map. + zoom_level: + type: integer + format: int32 + example: 6 + nullable: true + description: "Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels." + CurrencyProperties: + type: object + required: + - code + - name + - symbol + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + enabled: + type: boolean + example: true + default: true + description: Defaults to true + primary: + type: boolean + example: false + description: Is the primary currency? + code: + type: string + format: string + example: AMS + name: + type: string + format: string + example: Ankh-Morpork dollar + symbol: + type: string + format: string + example: "AM$" + decimal_places: + type: integer + format: int32 + example: 2 + description: Supports 0-16 decimals. + CurrencyStore: + type: object + required: + - code + - name + - symbol + properties: + enabled: + type: boolean + example: true + default: true + description: Defaults to true + primary: + type: boolean + example: true + description: Make this currency the primary currency for the current administration. You can set this value to FALSE, in which case nothing will change to the primary currency. If you set it to TRUE, the current primary currency will no longer be the primary currency. + code: + type: string + format: string + example: AMS + name: + type: string + format: string + example: Ankh-Morpork dollar + symbol: + type: string + format: string + example: "AM$" + decimal_places: + type: integer + format: int32 + example: 2 + description: Supports 0-16 decimals. + CurrencyUpdate: + type: object + properties: + enabled: + type: boolean + example: true + description: "If the currency is enabled" + primary: + type: boolean + example: true + description: "If the currency must be the primary for the user. You can only submit TRUE. Submitting FALSE will not drop this currency as the primary currency, because then the system would be without one." + enum: + - true + code: + type: string + format: string + example: AMS + description: "The currency code" + name: + type: string + format: string + example: Ankh-Morpork dollar + description: "The currency name" + symbol: + type: string + format: string + example: "AM$" + description: "The currency symbol" + decimal_places: + type: integer + format: int32 + example: 2 + description: "How many decimals to use when displaying this currency. Between 0 and 16." + Transaction: + type: object + required: + - transactions + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + user: + type: string + format: string + example: "3" + description: "User ID" + readOnly: true + group_title: + type: string + format: string + description: "Title of the transaction if it has been split in more than one piece. Empty otherwise." + example: "Split transaction title." + readOnly: false + nullable: true + transactions: + type: array + items: + $ref: '#/components/schemas/TransactionSplit' + TransactionStore: + type: object + required: + - transactions + properties: + error_if_duplicate_hash: + type: boolean + example: false + description: "Break if the submitted transaction exists already." + apply_rules: + type: boolean + example: false + description: "Whether or not to apply rules when submitting transaction." + fire_webhooks: + type: boolean + example: true + default: true + description: "Whether or not to fire the webhooks that are related to this event." + group_title: + type: string + format: string + description: "Title of the transaction if it has been split in more than one piece. Empty otherwise." + example: "Split transaction title." + nullable: true + transactions: + type: array + items: + $ref: '#/components/schemas/TransactionSplitStore' + TransactionUpdate: + type: object + properties: + apply_rules: + type: boolean + example: false + description: "Whether or not to apply rules when submitting transaction." + fire_webhooks: + type: boolean + example: true + default: true + description: "Whether or not to fire the webhooks that are related to this event." + group_title: + type: string + format: string + description: "Title of the transaction if it has been split in more than one piece. Empty otherwise." + example: "Split transaction title." + nullable: true + transactions: + type: array + items: + $ref: '#/components/schemas/TransactionSplitUpdate' + TransactionLink: + type: object + required: + - link_type_id + - inward_id + - outward_id + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + link_type_id: + type: string + format: string + example: "5" + description: The link type ID to use. You can also use the link_type_name field. + writeOnly: true + link_type_name: + type: string + format: string + example: "Is paid by" + description: The link type name to use. You can also use the link_type_id field. + writeOnly: true + inward_id: + type: string + format: string + example: "131" + description: "The inward transaction transaction_journal_id for the link. This becomes the 'is paid by' transaction of the set." + outward_id: + type: string + format: string + example: "131" + description: "The outward transaction transaction_journal_id for the link. This becomes the 'pays for' transaction of the set." + notes: + type: string + format: string + example: "Some example notes" + nullable: true + description: Optional. Some notes. + TransactionLinkStore: + type: object + required: + - link_type_id + - inward_id + - outward_id + properties: + link_type_id: + type: string + format: string + example: "5" + description: The link type ID to use. You can also use the link_type_name field. + writeOnly: true + link_type_name: + type: string + format: string + example: "Is paid by" + description: The link type name to use. You can also use the link_type_id field. + writeOnly: true + inward_id: + type: string + format: string + example: "131" + description: "The inward transaction transaction_journal_id for the link. This becomes the 'is paid by' transaction of the set." + outward_id: + type: string + format: string + example: "131" + description: "The outward transaction transaction_journal_id for the link. This becomes the 'pays for' transaction of the set." + notes: + type: string + format: string + example: "Some example notes" + nullable: true + description: Optional. Some notes. + TransactionLinkUpdate: + type: object + properties: + link_type_id: + type: string + format: string + example: "5" + description: The link type ID to use. Use this field OR use the link_type_name field. + writeOnly: true + link_type_name: + type: string + format: string + example: "Is paid by" + description: The link type name to use. Use this field OR use the link_type_id field. + writeOnly: true + inward_id: + type: string + format: string + example: "131" + description: "The inward transaction transaction_journal_id for the link. This becomes the 'is paid by' transaction of the set." + outward_id: + type: string + format: string + example: "131" + description: "The outward transaction transaction_journal_id for the link. This becomes the 'pays for' transaction of the set." + notes: + type: string + format: string + example: "Some example notes" + nullable: true + description: "Optional. Some notes. If you submit an empty string the current notes will be removed" + LinkType: + type: object + required: + - name + - inward + - outward + properties: + name: + type: string + format: string + example: "Paid" + inward: + type: string + format: string + example: "is (partially) paid for by" + outward: + type: string + format: string + example: "(partially) pays for" + editable: + type: boolean + example: false + readOnly: true + LinkTypeUpdate: + type: object + properties: + name: + type: string + format: string + example: "Paid" + inward: + type: string + format: string + example: "is (partially) paid for by" + outward: + type: string + format: string + example: "(partially) pays for" + TransactionSplit: + type: object + required: + - amount + - source_id + - destination_id + - date + - description + - type + properties: + user: + type: string + format: string + example: "3" + description: "User ID" + readOnly: true + transaction_journal_id: + type: string + format: string + example: "10421" + description: | + ID of the underlying transaction journal. Each transaction consists of a transaction group (see the top ID) and one or more journals + making up the splits of the transaction. + readOnly: true + type: + $ref: '#/components/schemas/TransactionTypeProperty' + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Date of the transaction" + order: + type: integer + format: int32 + example: 0 + nullable: true + description: "Order of this entry in the list of transactions." + object_has_currency_setting: + type: boolean + example: true + readOnly: true + description: "Indicates whether the transaction has a currency setting. For transactions this is always true." + currency_id: + type: string + format: string + example: "12" + description: Currency ID for the currency of this transaction. + currency_code: + type: string + format: string + example: EUR + description: Currency code for the currency of this transaction. + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: Currency symbol for the currency of this transaction. + currency_name: + type: string + format: string + example: "Euro" + description: Currency name for the currency of this transaction. + currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimals used in this currency. + foreign_currency_id: + type: string + format: string + example: "17" + nullable: true + description: Currency ID of the foreign currency, if this transaction has a foreign amount. + foreign_currency_code: + type: string + format: string + example: USD + description: Currency code of the foreign currency. Default is NULL. + nullable: true + foreign_currency_symbol: + type: string + format: string + example: "$" + nullable: true + readOnly: true + foreign_currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimals in the foreign currency. + nullable: true + readOnly: true + primary_currency_id: + type: string + format: string + example: "12" + readOnly: true + nullable: true + description: "Returns the primary currency ID of the administration. This currency is used as the currency for all `pc_*` amount and balance fields of this account." + primary_currency_code: + type: string + format: string + example: "EUR" + nullable: true + description: "Returns the primary currency code of the administration. This currency is used as the currency for all `pc_*` amount and balance fields of this account." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + nullable: true + description: "See the other `primary_*` fields." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + nullable: true + description: "See the other `primary_*` fields." + amount: + type: string + format: amount + example: "123.45" + description: "Amount of the transaction." + pc_amount: + type: string + format: amount + example: "123.45" + description: "Amount of the transaction in the primary currency of this administration. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings." + foreign_amount: + type: string + format: amount + example: "123.45" + nullable: true + description: The amount in the set foreign currency. May be NULL if the transaction does not have a foreign amount. + pc_foreign_amount: + type: string + format: amount + example: "123.45" + description: "Foreign amount of the transaction in the primary currency of this administration. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings." + source_balance_after: + type: string + format: amount + example: "123.45" + nullable: true + description: "The balance of the source account. This is the balance in the account's currency which may be different from this transaction, and is not provided in this model." + pc_source_balance_after: + type: string + format: amount + example: "123.45" + nullable: true + description: "The balance of the source account in the primary currency of this administration. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings." + destination_balance_after: + type: string + format: amount + example: "123.45" + nullable: true + description: "The balance of the destination account. This is the balance in the account's currency which may be different from this transaction, and is not provided in this model." + pc_destination_balance_after: + type: string + format: amount + example: "123.45" + nullable: true + description: "The balance of the destination account in the primary currency of this administration. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings." + description: + type: string + format: string + example: "Vegetables" + description: "Description of the transaction." + source_id: + type: string + format: string + example: "2" + nullable: true + description: "ID of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account." + source_name: + type: string + format: string + example: "Checking account" + nullable: true + description: "Name of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. Can be used instead of the source_id. If the transaction is a deposit, the source_name can be filled in freely: the account will be created based on the name." + source_iban: + type: string + format: string + example: "NL02ABNA0123456789" + nullable: true + readOnly: true + source_type: + $ref: '#/components/schemas/AccountTypeProperty' + destination_id: + type: string + format: string + example: "2" + nullable: true + description: "ID of the destination account. For a deposit or a transfer, this must always be an asset account. For withdrawals this must be an expense account." + destination_name: + type: string + format: string + example: "Buy and Large" + nullable: true + description: "Name of the destination account. You can submit the name instead of the ID. For everything except transfers, the account will be auto-generated if unknown, so submitting a name is enough." + destination_iban: + type: string + format: string + example: "NL02ABNA0123456789" + nullable: true + readOnly: true + destination_type: + $ref: '#/components/schemas/AccountTypeProperty' + budget_id: + type: string + format: string + nullable: true + example: "4" + description: The budget ID for this transaction. + budget_name: + type: string + format: string + example: Groceries + description: The name of the budget used. + nullable: true + readOnly: true + category_id: + type: string + format: string + nullable: true + example: "43" + description: The category ID for this transaction. + category_name: + type: string + format: string + example: Groceries + nullable: true + description: "The name of the category to be used. If the category is unknown, it will be created. If the ID and the name point to different categories, the ID overrules the name." + bill_id: + type: string + format: string + nullable: true + example: "111" + description: The associated subscription ID for this transaction. `bill` refers to the OLD name for subscriptions and this field will be removed. + bill_name: + type: string + format: string + example: "Monthly rent" + nullable: true + description: The associated subscription name for this transaction. `bill` refers to the OLD name for subscriptions and this field will be removed. + subscription_id: + type: string + format: string + nullable: true + example: "111" + description: The associated subscription ID for this transaction. + subscription_name: + type: string + format: string + example: "Monthly rent" + nullable: true + description: The associated subscription name for this transaction. + reconciled: + type: boolean + example: false + description: "If the transaction has been reconciled already. When you set this, the amount can no longer be edited by the user." + notes: + type: string + format: string + example: "Some example notes" + nullable: true + tags: + type: array + nullable: true + example: + description: Array of tags. + items: + type: string + format: string + description: Tag. + example: Barbecue preparation + internal_reference: + type: string + format: string + nullable: true + description: Reference to internal reference of other systems. + external_id: + type: string + nullable: true + format: string + description: Reference to external ID in other systems. + external_url: + type: string + format: string + nullable: true + description: External, custom URL for this transaction. + original_source: + type: string + nullable: true + format: string + description: System generated identifier for original creator of transaction. + readOnly: true + recurrence_id: + type: string + nullable: true + format: string + description: Reference to recurrence that made the transaction. + readOnly: true + recurrence_total: + type: integer + format: int32 + example: 0 + description: "Total number of transactions expected to be created by this recurrence repetition. Will be 0 if infinite." + readOnly: true + nullable: true + recurrence_count: + type: integer + format: int32 + example: 12 + description: "The # of the current transaction created under this recurrence." + readOnly: true + nullable: true + import_hash_v2: + type: string + nullable: true + format: string + description: Hash value of original import transaction (for duplicate detection). + readOnly: true + sepa_cc: + type: string + format: string + nullable: true + description: SEPA Clearing Code + sepa_ct_op: + type: string + format: string + description: SEPA Opposing Account Identifier + nullable: true + sepa_ct_id: + type: string + format: string + nullable: true + description: SEPA end-to-end Identifier + sepa_db: + type: string + format: string + nullable: true + description: SEPA mandate identifier + sepa_country: + type: string + nullable: true + format: string + description: SEPA Country + sepa_ep: + type: string + nullable: true + format: string + description: SEPA External Purpose indicator + sepa_ci: + type: string + format: string + nullable: true + description: SEPA Creditor Identifier + sepa_batch_id: + type: string + format: string + nullable: true + description: SEPA Batch ID + interest_date: + type: string + format: date-time + nullable: true + book_date: + type: string + format: date-time + nullable: true + process_date: + type: string + format: date-time + nullable: true + due_date: + type: string + format: date-time + nullable: true + payment_date: + type: string + format: date-time + nullable: true + invoice_date: + type: string + format: date-time + nullable: true + latitude: + type: number + format: double + example: 51.983333 + nullable: true + description: Latitude of the transaction's location, if applicable. Can be used to draw a map. + longitude: + type: number + format: double + example: 5.916667 + nullable: true + description: Latitude of the transaction's location, if applicable. Can be used to draw a map. + zoom_level: + type: integer + format: int32 + example: 6 + nullable: true + description: "Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels." + has_attachments: + type: boolean + example: false + description: "If the transaction has attachments." + TransactionSplitStore: + type: object + required: + - amount + - date + - description + - type + properties: + type: + $ref: '#/components/schemas/TransactionTypeProperty' + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Date of the transaction" + amount: + type: string + format: amount + example: "123.45" + description: "Amount of the transaction." + description: + type: string + format: string + example: "Vegetables" + description: "Description of the transaction." + order: + type: integer + format: int32 + example: 0 + nullable: true + description: "Order of this entry in the list of transactions." + currency_id: + type: string + format: string + example: "12" + nullable: true + description: Currency ID. Default is the source account's currency, or the user's financial administration's currency. The value you submit may be overruled by the source or destination account. + currency_code: + type: string + format: string + example: EUR + nullable: true + description: Currency code. Default is the source account's currency, or the user's financial administration's primary currency. The value you submit may be overruled by the source or destination account. + foreign_amount: + type: string + format: amount + example: "123.45" + nullable: true + description: The amount in a foreign currency. + foreign_currency_id: + type: string + format: string + example: "17" + nullable: true + description: Currency ID of the foreign currency. Default is null. Is required when you submit a foreign amount. + foreign_currency_code: + type: string + format: string + example: USD + description: Currency code of the foreign currency. Default is NULL. Can be used instead of the foreign_currency_id, but this or the ID is required when submitting a foreign amount. + nullable: true + budget_id: + type: string + format: string + nullable: true + example: "4" + description: The budget ID for this transaction. + budget_name: + type: string + format: string + example: Groceries + description: The name of the budget to be used. If the budget name is unknown, the ID will be used or the value will be ignored. + nullable: true + category_id: + type: string + format: string + nullable: true + example: "43" + description: The category ID for this transaction. + category_name: + type: string + format: string + example: Groceries + nullable: true + description: "The name of the category to be used. If the category is unknown, it will be created. If the ID and the name point to different categories, the ID overrules the name." + source_id: + type: string + format: string + example: "2" + nullable: true + description: "ID of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account." + source_name: + type: string + format: string + example: "Checking account" + nullable: true + description: "Name of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. Can be used instead of the source_id. If the transaction is a deposit, the source_name can be filled in freely: the account will be created based on the name." + destination_id: + type: string + format: string + example: "2" + nullable: true + description: "ID of the destination account. For a deposit or a transfer, this must always be an asset account. For withdrawals this must be an expense account." + destination_name: + type: string + format: string + example: "Buy and Large" + nullable: true + description: "Name of the destination account. You can submit the name instead of the ID. For everything except transfers, the account will be auto-generated if unknown, so submitting a name is enough." + reconciled: + type: boolean + example: false + description: "If the transaction has been reconciled already. When you set this, the amount can no longer be edited by the user." + piggy_bank_id: + type: integer + format: int32 + description: Optional. Use either this or the piggy_bank_name + writeOnly: true + nullable: true + piggy_bank_name: + type: string + format: string + description: Optional. Use either this or the piggy_bank_id + writeOnly: true + nullable: true + bill_id: + type: string + format: string + nullable: true + example: "112" + description: Optional. Use either this or the bill_name + bill_name: + type: string + format: string + example: "Monthly rent" + nullable: true + description: Optional. Use either this or the bill_id + tags: + type: array + nullable: true + example: + description: Array of tags. + items: + type: string + format: string + description: Tag. + example: Barbecue preparation + notes: + type: string + format: string + example: "Some example notes" + nullable: true + internal_reference: + type: string + format: string + nullable: true + description: Reference to internal reference of other systems. + external_id: + type: string + nullable: true + format: string + description: Reference to external ID in other systems. + external_url: + type: string + format: string + nullable: true + description: External, custom URL for this transaction. + sepa_cc: + type: string + format: string + nullable: true + description: SEPA Clearing Code + sepa_ct_op: + type: string + format: string + description: SEPA Opposing Account Identifier + nullable: true + sepa_ct_id: + type: string + format: string + nullable: true + description: SEPA end-to-end Identifier + sepa_db: + type: string + format: string + nullable: true + description: SEPA mandate identifier + sepa_country: + type: string + nullable: true + format: string + description: SEPA Country + sepa_ep: + type: string + nullable: true + format: string + description: SEPA External Purpose indicator + sepa_ci: + type: string + format: string + nullable: true + description: SEPA Creditor Identifier + sepa_batch_id: + type: string + format: string + nullable: true + description: SEPA Batch ID + interest_date: + type: string + format: date-time + nullable: true + book_date: + type: string + format: date-time + nullable: true + process_date: + type: string + format: date-time + nullable: true + due_date: + type: string + format: date-time + nullable: true + payment_date: + type: string + format: date-time + nullable: true + invoice_date: + type: string + format: date-time + nullable: true + TransactionSplitUpdate: + type: object + properties: + transaction_journal_id: + type: string + format: string + example: "123" + description: "Transaction journal ID of current transaction (split)." + type: + $ref: '#/components/schemas/TransactionTypeProperty' + date: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + description: "Date of the transaction" + amount: + type: string + format: amount + example: "123.45" + description: "Amount of the transaction." + description: + type: string + format: string + example: "Vegetables" + description: "Description of the transaction." + order: + type: integer + format: int32 + example: 0 + nullable: true + description: "Order of this entry in the list of transactions." + currency_id: + type: string + format: string + example: "12" + nullable: true + description: Currency ID. Default is the source account's currency, or the user's financial administration's primary currency. Can be used instead of currency_code. + currency_code: + type: string + format: string + example: EUR + nullable: true + description: Currency code. Default is the source account's currency, or the user's financial administration's primary currency. Can be used instead of currency_id. + currency_symbol: + type: string + format: string + example: "$" + readOnly: true + currency_name: + type: string + format: string + example: "Euro" + readOnly: true + currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimals used in this currency. + readOnly: true + foreign_amount: + type: string + format: amount + example: "123.45" + nullable: true + description: The amount in a foreign currency. + foreign_currency_id: + type: string + format: string + example: "17" + nullable: true + description: Currency ID of the foreign currency. Default is null. Is required when you submit a foreign amount. + foreign_currency_code: + type: string + format: string + example: USD + description: Currency code of the foreign currency. Default is NULL. Can be used instead of the foreign_currency_id, but this or the ID is required when submitting a foreign amount. + nullable: true + foreign_currency_symbol: + type: string + format: string + example: "$" + nullable: true + readOnly: true + foreign_currency_decimal_places: + type: integer + format: int32 + example: 2 + description: Number of decimals in the currency + nullable: true + readOnly: true + budget_id: + type: string + format: string + nullable: true + example: "4" + description: The budget ID for this transaction. + budget_name: + type: string + format: string + example: Groceries + description: The name of the budget to be used. If the budget name is unknown, the ID will be used or the value will be ignored. + nullable: true + readOnly: true + category_id: + type: string + format: string + nullable: true + example: "43" + description: The category ID for this transaction. + category_name: + type: string + format: string + example: Groceries + nullable: true + description: "The name of the category to be used. If the category is unknown, it will be created. If the ID and the name point to different categories, the ID overrules the name." + source_id: + type: string + format: string + example: "2" + nullable: true + description: "ID of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account." + source_name: + type: string + format: string + example: "Checking account" + nullable: true + description: "Name of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. Can be used instead of the source_id. If the transaction is a deposit, the source_name can be filled in freely: the account will be created based on the name." + source_iban: + type: string + format: string + example: "NL02ABNA0123456789" + nullable: true + destination_id: + type: string + format: string + example: "2" + nullable: true + description: "ID of the destination account. For a deposit or a transfer, this must always be an asset account. For withdrawals this must be an expense account." + destination_name: + type: string + format: string + example: "Buy and Large" + nullable: true + description: "Name of the destination account. You can submit the name instead of the ID. For everything except transfers, the account will be auto-generated if unknown, so submitting a name is enough." + destination_iban: + type: string + format: string + example: "NL02ABNA0123456789" + nullable: true + reconciled: + type: boolean + example: false + description: "If the transaction has been reconciled already. When you set this, the amount can no longer be edited by the user." + bill_id: + type: string + format: string + nullable: true + example: "111" + description: Optional. Use either this or the bill_name + bill_name: + type: string + format: string + example: "Monthly rent" + nullable: true + description: Optional. Use either this or the bill_id + tags: + type: array + nullable: true + example: + description: Array of tags. + items: + type: string + format: string + description: Tag. + example: Barbecue preparation + notes: + type: string + format: string + example: "Some example notes" + nullable: true + internal_reference: + type: string + format: string + nullable: true + description: Reference to internal reference of other systems. + external_id: + type: string + nullable: true + format: string + description: Reference to external ID in other systems. + external_url: + type: string + format: string + nullable: true + description: External, custom URL for this transaction. + sepa_cc: + type: string + format: string + nullable: true + description: SEPA Clearing Code + sepa_ct_op: + type: string + format: string + description: SEPA Opposing Account Identifier + nullable: true + sepa_ct_id: + type: string + format: string + nullable: true + description: SEPA end-to-end Identifier + sepa_db: + type: string + format: string + nullable: true + description: SEPA mandate identifier + sepa_country: + type: string + nullable: true + format: string + description: SEPA Country + sepa_ep: + type: string + nullable: true + format: string + description: SEPA External Purpose indicator + sepa_ci: + type: string + format: string + nullable: true + description: SEPA Creditor Identifier + sepa_batch_id: + type: string + format: string + nullable: true + description: SEPA Batch ID + interest_date: + type: string + format: date-time + nullable: true + book_date: + type: string + format: date-time + nullable: true + process_date: + type: string + format: date-time + nullable: true + due_date: + type: string + format: date-time + nullable: true + payment_date: + type: string + format: date-time + nullable: true + invoice_date: + type: string + format: date-time + nullable: true + User: + title: A single user + type: object + required: + - email + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + email: + type: string + format: email + example: "james@firefly-iii.org" + description: The new users email address. + blocked: + type: boolean + example: false + description: Boolean to indicate if the user is blocked. + blocked_code: + $ref: '#/components/schemas/UserBlockedCodeProperty' + role: + $ref: '#/components/schemas/UserRoleProperty' + UserGroupRead: + type: object + required: + - type + - id + - attributes + - links + properties: + type: + type: string + format: string + example: "user_groups" + description: "Immutable value" + id: + type: string + format: string + example: "2" + attributes: + $ref: '#/components/schemas/UserGroupReadAttributes' + links: + $ref: '#/components/schemas/ObjectLink' + UserGroupReadAttributes: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + in_use: + type: boolean + example: false + readOnly: true + description: "Is this user group ('financial administration') currently the active administration?" + can_see_members: + type: boolean + example: true + readOnly: true + description: "Can the current user see the members of this user group?" + title: + type: string + format: string + description: "Title of the user group. By default, it is the same as the user's email address." + example: "demo@firefly" + readOnly: false + primary_currency_id: + type: string + format: string + example: "12" + readOnly: true + description: "Returns the primary currency ID of the user group." + primary_currency_code: + type: string + format: string + example: "EUR" + description: "Returns the primary currency code of the user group." + primary_currency_symbol: + type: string + format: string + example: "$" + readOnly: true + description: "Returns the primary currency symbol of the user group." + primary_currency_decimal_places: + type: integer + format: int32 + example: 2 + readOnly: true + description: "Returns the primary currency decimal places of the user group." + members: + type: array + items: + $ref: '#/components/schemas/UserGroupReadMembers' + UserGroupReadMembers: + type: object + properties: + user_id: + type: string + format: string + example: "5" + readOnly: true + description: "The ID of the member." + user_email: + type: string + format: email + example: "james@firefly-iii.org" + readOnly: true + description: "The email address of the member" + you: + type: boolean + example: false + readOnly: true + description: "Is this you? (the current user)" + roles: + type: array + uniqueItems: true + items: + $ref: '#/components/schemas/UserGroupReadRole' + UserGroupReadRole: + type: string + enum: + - ro + - mng_trx + - mng_meta + - read_budgets + - read_piggies + - read_subscriptions + - read_rules + - read_recurring + - read_webhooks + - read_currencies + - mng_budgets + - mng_piggies + - mng_subscriptions + - mng_rules + - mng_recurring + - mng_webhooks + - mng_currencies + - view_reports + - view_memberships + - full + - owner + description: > + The possible roles of the user in this user group are documented here: https://docs.firefly-iii.org/references/firefly-iii/api/ + UserGroupSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/UserGroupRead' + UserGroupUpdate: + type: object + required: + - title + properties: + title: + type: string + format: string + example: "New user group title" + description: "A descriptive title for the user group." + primary_currency_id: + type: string + format: string + example: "1" + description: "Use either primary_currency_id or primary_currency_code. This will set the primary currency for the user group ('financial administration')." + primary_currency_code: + type: string + format: string + example: "EUR" + description: "Use either primary_currency_id or primary_currency_code. This will set the primary currency for the user group ('financial administration')." + WebhookDelivery: + type: string + format: string + nullable: false + example: + - "JSON" + description: Format of the delivered response. + enum: + - JSON + WebhookDeliveryArray: + type: array + minItems: 1 + maxItems: 1 + items: + $ref: '#/components/schemas/WebhookDelivery' + example: + - "JSON" + WebhookProperties: + title: "A single webhook (read)" + type: object + required: + - title + - trigger + - response + - delivery + - url + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + active: + type: boolean + example: false + description: Boolean to indicate if the webhook is active + title: + type: string + format: string + example: "Update magic mirror on new transaction" + description: A title for the webhook for easy recognition. + secret: + type: string + format: string + example: "iMLZLtLx2JHWhK9Dtyuoqyir" + readOnly: true + description: A 24-character secret for the webhook. It's generated by Firefly III when saving a new webhook. If you submit a new secret through the PUT endpoint it will generate a new secret for the selected webhook, a new secret bearing no relation to whatever you just submitted. + triggers: + $ref: '#/components/schemas/WebhookTriggerArray' + responses: + $ref: '#/components/schemas/WebhookResponseArray' + deliveries: + $ref: '#/components/schemas/WebhookDeliveryArray' + url: + type: string + format: string + example: "https://example.com" + readOnly: false + description: The URL of the webhook. Has to start with `https`. + WebhookResponse: + type: string + format: string + nullable: false + example: "RELEVANT" + description: Indicator for what Firefly III will deliver to the webhook URL. + enum: + - TRANSACTIONS + - ACCOUNTS + - BUDGET + - RELEVANT + - NONE + WebhookResponseArray: + type: array + minItems: 1 + maxItems: 1 + items: + $ref: '#/components/schemas/WebhookResponse' + example: + - "TRANSACTIONS" + WebhookStore: + title: "A single webhook (store)" + type: object + required: + - title + - trigger + - response + - delivery + - url + properties: + active: + type: boolean + example: false + description: Boolean to indicate if the webhook is active + title: + type: string + format: string + example: "Update magic mirror on new transaction" + description: A title for the webhook for easy recognition. + triggers: + $ref: '#/components/schemas/WebhookTriggerArray' + responses: + $ref: '#/components/schemas/WebhookResponseArray' + deliveries: + $ref: '#/components/schemas/WebhookDeliveryArray' + url: + type: string + format: string + example: "https://example.com" + readOnly: false + description: The URL of the webhook. Has to start with `https`. + WebhookTrigger: + type: string + format: string + nullable: false + example: "DESTROY_TRANSACTION" + description: The trigger for the webhook. + enum: + - ANY + - STORE_TRANSACTION + - UPDATE_TRANSACTION + - DESTROY_TRANSACTION + - STORE_BUDGET + - UPDATE_BUDGET + - DESTROY_BUDGET + - STORE_UPDATE_BUDGET_LIMIT + WebhookTriggerArray: + type: array + minItems: 1 + maxItems: 3 + items: + $ref: '#/components/schemas/WebhookTrigger' + example: + - "STORE_TRANSACTION" + - "UPDATE_TRANSACTION" + WebhookUpdate: + title: "A single webhook (update)" + type: object + properties: + active: + type: boolean + example: false + description: Boolean to indicate if the webhook is active + title: + type: string + format: string + example: "Update magic mirror on new transaction" + description: A title for the webhook for easy recognition. + secret: + type: string + format: string + example: "iMLZLtLx2JHWhK9Dtyuoqyir" + description: A 24-character secret for the webhook. It's generated by Firefly III when saving a new webhook. If you submit a new secret through the PUT endpoint it will generate a new secret for the selected webhook, a new secret bearing no relation to whatever you just submitted. + triggers: + $ref: '#/components/schemas/WebhookTriggerArray' + responses: + $ref: '#/components/schemas/WebhookResponseArray' + deliveries: + $ref: '#/components/schemas/WebhookDeliveryArray' + url: + type: string + format: string + example: "https://example.com" + readOnly: false + description: The URL of the webhook. Has to start with `https`. + WebhookAttempt: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + webhook_message_id: + type: string + format: string + example: "5" + description: "The ID of the webhook message this attempt belongs to." + status_code: + type: integer + format: int32 + example: 404 + nullable: true + description: "The HTTP status code of the error, if any." + logs: + type: string + format: string + example: "Page not found" + nullable: true + description: "Internal log for this attempt. May contain sensitive user data." + response: + type: string + format: amount + example: "Page not found" + nullable: true + description: "Webhook receiver response for this attempt, if any. May contain sensitive user data." + WebhookMessage: + type: object + properties: + created_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + updated_at: + type: string + format: date-time + example: "2026-10-01T00:00:00+00:00" + readOnly: true + sent: + type: boolean + example: false + description: If this message is sent yet. + errored: + type: boolean + example: false + description: If this message has errored out. + webhook_id: + type: string + format: string + example: "5" + description: "The ID of the webhook this message belongs to." + uuid: + type: string + format: string + example: "7a344c02-5b52-46b1-90e6-a437431dcf07" + description: "Long UUID string for identification of this webhook message." + message: + type: string + format: string + example: "{some:message}" + nullable: true + description: "The actual message that is sent or will be sent as JSON string." + AttachableType: + type: string + format: string + example: "Bill" + description: The object class to which the attachment must be linked. + enum: + - Account + - Budget + - Bill + - TransactionJournal + - PiggyBank + - Tag + AutoBudgetPeriod: + type: string + format: string + example: "monthly" + nullable: true + description: "Period for the auto budget" + enum: + - daily + - weekly + - monthly + - quarterly + - "half-year" + - yearly + - null + AutoBudgetType: + type: string + format: string + example: reset + nullable: true + description: "The type of auto-budget that Firefly III must create." + enum: + - reset + - rollover + - none + - null + BillRepeatFrequency: + type: string + format: string + example: "monthly" + description: How often the bill must be paid. + enum: + - weekly + - monthly + - quarterly + - "half-year" + - yearly + PolymorphicProperty: + oneOf: + - type: boolean + - type: string + - type: object + - type: array + items: + $ref: '#/components/schemas/StringArrayItem' + RecurrenceRepetitionType: + type: string + format: string + example: "weekly" + description: "The type of the repetition. ndom means: the n-th weekday of the month, where you can also specify which day of the week." + enum: + - daily + - weekly + - ndom + - monthly + - yearly + RecurrenceTransactionType: + type: string + format: string + example: "withdrawal" + enum: + - withdrawal + - transfer + - deposit + RuleActionKeyword: + type: string + format: string + example: "set_category" + description: The type of thing this action will do. A limited set is possible. + enum: + - user_action + - set_category + - clear_category + - set_budget + - clear_budget + - add_tag + - remove_tag + - remove_all_tags + - set_description + - append_description + - prepend_description + - set_source_account + - set_destination_account + - set_notes + - append_notes + - prepend_notes + - clear_notes + - link_to_bill + - convert_withdrawal + - convert_deposit + - convert_transfer + - delete_transaction + RuleTriggerKeyword: + type: string + format: string + example: "user_action" + description: The type of thing this trigger responds to. A limited set is possible + enum: + - from_account_starts + - from_account_ends + - from_account_is + - from_account_contains + - to_account_starts + - to_account_ends + - to_account_is + - to_account_contains + - amount_less + - amount_exactly + - amount_more + - description_starts + - description_ends + - description_contains + - description_is + - transaction_type + - category_is + - budget_is + - tag_is + - currency_is + - has_attachments + - has_no_category + - has_any_category + - has_no_budget + - has_any_budget + - has_no_tag + - has_any_tag + - notes_contains + - notes_starts + - notes_end + - notes_are + - no_notes + - any_notes + - source_account_is + - destination_account_is + - source_account_starts + RuleTriggerType: + type: string + format: string + example: store-journal + description: Which action is necessary for the rule to fire? Use either store-journal, update-journal or manual-activation. + enum: + - "store-journal" + - "update-journal" + - "manual-activation" + StringArrayItem: + type: string + format: string + example: "EUR" + description: "The actual preference content." + UserBlockedCodeProperty: + type: string + format: string + nullable: true + example: "email_changed" + description: If you say the user must be blocked, this will be the reason code. + enum: + - email_changed + - null + UserRoleProperty: + type: string + format: string + example: "owner" + nullable: true + description: Role for the user. Can be empty or omitted. + enum: + - owner + - demo + - null + BasicSummary: + type: object + additionalProperties: + $ref: '#/components/schemas/BasicSummaryEntry' + BasicSummaryEntry: + type: object + properties: + key: + type: string + format: string + example: "balance-in-EUR" + description: "This is a reference to the type of info shared, not influenced by translations or user preferences. The EUR value is a reference to the currency code. Possibilities are: balance-in-ABC, spent-in-ABC, earned-in-ABC, bills-paid-in-ABC, bills-unpaid-in-ABC, left-to-spend-in-ABC and net-worth-in-ABC." + title: + type: string + format: string + example: "Balance ($)" + description: "A translated title for the information shared." + monetary_value: + type: number + format: double + example: 123.45 + description: "The amount as a float." + currency_id: + type: string + format: string + example: "5" + description: "The currency ID of the associated currency." + currency_code: + type: string + format: string + example: "EUR" + currency_symbol: + type: string + format: string + example: "$" + currency_decimal_places: + type: integer + format: int32 + example: 2 + description: "Number of decimals for the associated currency." + no_available_budgets: + type: boolean + example: false + description: "True if there are no available budgets available." + value_parsed: + type: string + format: string + example: "$ 12.45" + description: "The amount formatted according to the users locale" + sub_title: + type: string + format: string + example: "$20 + $-40" + description: "A short explanation of the amounts origin. Already formatted according to the locale of the user or translated, if relevant." + Configuration: + type: object + required: + - title + - value + - editable + properties: + title: + $ref: '#/components/schemas/ConfigValueFilter' + value: + $ref: '#/components/schemas/PolymorphicProperty' + editable: + type: boolean + example: true + readOnly: false + description: "If this config variable can be edited by the user" + ConfigurationUpdate: + type: object + required: + - value + properties: + value: + $ref: '#/components/schemas/PolymorphicProperty' + CronResult: + type: object + properties: + recurring_transactions: + type: array + items: + $ref: '#/components/schemas/CronResultRow' + auto_budgets: + type: array + items: + $ref: '#/components/schemas/CronResultRow' + exchange_rates: + type: array + items: + $ref: '#/components/schemas/CronResultRow' + bill_notifications: + type: array + items: + $ref: '#/components/schemas/CronResultRow' + webhooks: + type: array + items: + $ref: '#/components/schemas/CronResultRow' + CronResultRow: + type: object + properties: + job_fired: + type: boolean + example: true + nullable: true + description: | + This value tells you if this specific cron job actually fired. It may not fire. Some cron jobs + only fire every 24 hours, for example. + job_succeeded: + type: boolean + example: true + nullable: true + description: | + This value tells you if this specific cron job actually did something. The job may fire but not + change anything. + job_errored: + type: boolean + example: false + nullable: true + description: If the cron job ran into some kind of an error, this value will be true. + message: + type: string + format: string + example: "Cron result message" + nullable: true + description: | + If the cron job ran into some kind of an error, this value will be the error message. The success message + if the job actually ran OK. + user: + type: string + format: string + example: "1" + nullable: false + description: | + The user for which this particular job result is. + ReleaseNotes: + type: object + properties: + version: + type: string + format: string + example: "6.7.8" + release_notes: + nullable: true + type: string + format: string + description: The release notes as HTML. + release_notes_markdown: + nullable: true + type: string + format: string + description: The release notes in Markdown format. + SystemInfo: + type: object + properties: + data: + type: object + properties: + version: + type: string + format: string + example: "6.7.8" + api_version: + type: string + format: string + description: Same value as the version field. + example: "6.7.8" + php_version: + type: string + format: string + example: "8.1.5" + os: + type: string + format: string + example: "Linux" + driver: + type: string + format: string + example: "mysql" + UserSingle: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/UserRead' + AccountTypeFilter: + type: string + enum: + - all + - asset + - cash + - expense + - revenue + - special + - hidden + - liability + - liabilities + - Default account + - Cash account + - Asset account + - Expense account + - Revenue account + - Initial balance account + - Beneficiary account + - Import account + - Reconciliation account + - Loan + - Debt + - Mortgage + TransactionTypeFilter: + type: string + enum: + - all + - withdrawal + - withdrawals + - expense + - deposit + - deposits + - income + - transfer + - transfers + - opening_balance + - reconciliation + - special + - specials + - default + Meta: + type: object + properties: + pagination: + type: object + properties: + total: + type: integer + example: 3 + count: + type: integer + example: 20 + per_page: + type: integer + example: 100 + current_page: + type: integer + example: 1 + total_pages: + type: integer + example: 1 + AccountRoleProperty: + type: string + format: string + example: "defaultAsset" + description: "Is only mandatory when the type is asset." + nullable: true + enum: + - defaultAsset + - sharedAsset + - savingAsset + - ccAsset + - cashWalletAsset + - null + AccountTypeProperty: + type: string + format: string + example: "Asset account" + readOnly: true + enum: + - Default account + - Cash account + - Asset account + - Expense account + - Revenue account + - Initial balance account + - Beneficiary account + - Import account + - Reconciliation account + - Loan + - Debt + - Mortgage + ChartDatasetPeriodProperty: + type: string + format: string + example: "1M" + description: "Period of the chart." + enum: + - 1D + - 1W + - 1M + - 3M + - 1Y + - custom + CreditCardTypeProperty: + type: string + format: string + example: monthlyFull + description: "Mandatory when the account_role is ccAsset. Can only be monthlyFull or null." + nullable: true + enum: + - monthlyFull + - null + InterestPeriodProperty: + type: string + format: string + example: monthly + description: "Mandatory when type is liability. Period over which the interest is calculated." + nullable: true + enum: + - daily + - weekly + - monthly + - quarterly + - half-year + - yearly + - null + LiabilityDirectionProperty: + type: string + format: string + example: credit + description: "'credit' indicates somebody owes you the liability. 'debit' Indicates you owe this debt yourself. Works only for liabilities." + nullable: true + enum: + - credit + - debit + - null + LiabilityTypeProperty: + type: string + format: string + example: "loan" + description: "Mandatory when type is liability. Specifies the exact type." + nullable: true + enum: + - loan + - debt + - mortgage + - null + ShortAccountTypeProperty: + type: string + format: string + example: "asset" + description: "Can only be one one these account types. import, initial-balance and reconciliation cannot be set manually." + enum: + - asset + - expense + - import + - revenue + - cash + - liability + - liabilities + - "initial-balance" + - reconciliation + TransactionTypeProperty: + type: string + format: string + example: "withdrawal" + enum: + - withdrawal + - deposit + - transfer + - reconciliation + - opening balance + BadRequestResponse: + type: object + properties: + message: + type: string + format: string + example: "Bad Request" + exception: + type: string + format: string + example: "BadRequestHttpException" + InternalExceptionResponse: + type: object + properties: + message: + type: string + format: string + example: "Internal Exception" + exception: + type: string + format: string + example: "InternalException" + NotFoundResponse: + type: object + properties: + message: + type: string + format: string + example: "Resource not found" + exception: + type: string + format: string + example: "NotFoundHttpException" + UnauthenticatedResponse: + type: object + properties: + message: + type: string + format: string + example: "Unauthenticated" + exception: + type: string + format: string + example: "AuthenticationException" + ValidationErrorResponse: + type: object + properties: + message: + type: string + format: string + example: "The given data was invalid." + errors: + type: object + properties: + email: + type: array + items: + type: string + format: string + force: + type: array + items: + type: string + format: string + blocked: + type: array + items: + type: string + format: string + field: + type: array + items: + type: string + format: string + role: + type: array + items: + type: string + format: string + blocked_code: + type: array + items: + type: string + format: string + name: + type: array + items: + type: string + format: string + type: + type: array + items: + type: string + format: string + iban: + type: array + items: + type: string + format: string + start: + type: array + items: + type: string + format: string + end: + type: array + items: + type: string + format: string + date: + type: array + items: + type: string + format: string + securitySchemes: + firefly_iii_auth: + type: oauth2 + description: Default OAuth2 flow + flows: + authorizationCode: + authorizationUrl: https://demo.firefly-iii.org/oauth/authorize + tokenUrl: https://demo.firefly-iii.org/oauth/token + refreshUrl: https://demo.firefly-iii.org/oauth/token + scopes: {} + local_bearer_auth: + description: Optional Bearer token flow + type: http + scheme: bearer +security: + - firefly_iii_auth: [] + - local_bearer_auth: [] diff --git a/biome.jsonc b/biome.jsonc index 603971a..15bae4a 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -9,7 +9,9 @@ "!.mcp.json", "!.impeccable", "!src/lib/components/ui", - "!src/routes/claddcn.css" + "!src/routes/claddcn.css", + "!src/lib/api/schema.d.ts", + "!api" ] }, "javascript": { "globals": ["Bun"] }, @@ -28,6 +30,10 @@ "linter": { "rules": { "a11y": { "useAnchorContent": "off" }, + "suspicious": { + "noReturnAssign": "off", + "noAssignInExpressions": "off" + }, "style": { "useFilenamingConvention": { "level": "error", diff --git a/bun.lock b/bun.lock index e437d9a..07ebd23 100644 --- a/bun.lock +++ b/bun.lock @@ -14,10 +14,19 @@ "@sveltejs/kit": "^3.0.1", "@sveltejs/vite-plugin-svelte": "^7.1.2", "@tailwindcss/vite": "^4.3.0", + "@tanstack/svelte-query": "^6.3.3", "@types/bun": "^1.3.0", + "@types/d3-array": "^3.2.2", + "@types/d3-scale": "^4.0.9", + "@types/d3-shape": "^3.2.0", "bits-ui": "^2.16.3", "clsx": "^2.1.1", + "d3-array": "^3.2.4", + "d3-scale": "^4.0.2", + "d3-shape": "^3.2.0", "mode-watcher": "^1.1.0", + "openapi-fetch": "^0.17.0", + "openapi-typescript": "^7.13.0", "shadcn-svelte": "^1.3.0", "svelte": "^5.57.1", "svelte-check": "^4.7.6", @@ -33,6 +42,8 @@ }, }, "packages": { + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], @@ -97,6 +108,12 @@ "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + "@redocly/ajv": ["@redocly/ajv@8.11.2", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js-replace": "^1.0.1" } }, "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg=="], + + "@redocly/config": ["@redocly/config@0.22.0", "", {}, "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ=="], + + "@redocly/openapi-core": ["@redocly/openapi-core@1.34.21", "", { "dependencies": { "@redocly/ajv": "8.11.2", "@redocly/config": "0.22.0", "colorette": "1.4.0", "https-proxy-agent": "7.0.6", "js-levenshtein": "1.1.6", "js-yaml": "4.3.2", "minimatch": "5.1.9", "pluralize": "8.0.0", "yaml-ast-parser": "0.0.43" } }, "sha512-yXMiBFYJbP5JOaxPzx2tJhK+v8h2Wu2uhad1Ro6GzVT8E3F4GcQ7sbLPJ9w4zvGjfxroD0bIh5B0pDtnLV/qUA=="], + "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.14", "", { "os": "android", "cpu": "arm" }, "sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg=="], "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.14", "", { "os": "android", "cpu": "arm64" }, "sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ=="], @@ -177,30 +194,56 @@ "@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="], + "@tanstack/query-core": ["@tanstack/query-core@5.104.3", "", {}, "sha512-DZY9TuJAOgU3UyHUhXb4CcTYEHNZszlwkPg4VViIwTxOKzLprPUU+rbaPZQd3srqkGOtpaDdKpW972UV/LKlcg=="], + + "@tanstack/svelte-query": ["@tanstack/svelte-query@6.3.3", "", { "dependencies": { "@tanstack/query-core": "5.104.3" }, "peerDependencies": { "svelte": "^5.25.0" } }, "sha512-yPCaSm53NGgFM8gLgJUPZNrTMGNqjcJ8eguh0zFrqqmJDNr6lxhgqN2szmsrgViJ64DC9NYnOminmLlw8IxgXw=="], + "@types/bun": ["@types/bun@1.4.3", "", { "dependencies": { "bun-types": "1.4.3" } }, "sha512-N67Pqy8JXbAY/j0tNraS3V5mubGvc6rrrNDmDCtZLlFzccbUJPDb0tvgUBC5q4m8ybkP93Jcn1QB+RYQ6PvBhw=="], + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-shape": ["@types/d3-shape@3.2.0", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/node": ["@types/node@26.6.5", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg=="], "acorn": ["acorn@8.19.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + "ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], "ansi-regex": ["ansi-regex@6.4.0", "", {}, "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw=="], "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "bits-ui": ["bits-ui@2.19.5", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/dom": "^1.7.1", "esm-env": "^1.1.2", "runed": "^0.35.1", "svelte-toolbelt": "^0.10.6", "tabbable": "^6.2.0" }, "peerDependencies": { "@internationalized/date": "^3.8.1", "svelte": "^5.33.0" } }, "sha512-TEwkLSYElE5SE0fIdcItiFPfyg9vrR67N1Mt6VvZCqZo24dwTA1MpGVV3WeyIg7rfVAaZ0So8a0/dcnPngCoew=="], + "brace-expansion": ["brace-expansion@2.1.7", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g=="], + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], "bun-types": ["bun-types@1.4.3", "", { "dependencies": { "@types/node": "*", "undici-types": "*" } }, "sha512-tinRJNGOmUN+tEAsn2y2e942n9JHRHR42iUYzDH75NmhJqVBokGSQkkfSFdNWwsANIdrK6ACH9t01M452YyTwg=="], + "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], "citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="], @@ -213,12 +256,34 @@ "cn": ["cn@0.3.3", "", { "bin": { "cn": "bin/cn.mjs" } }, "sha512-OEiyJkSpYm2kOuNOKQ+c2wmzZRG8orrb9fnObtHTbCGNx/E9KLnGcmcocItOzREKk5KzQN5I2e3BUCj563KEpw=="], + "colorette": ["colorette@1.4.0", "", {}, "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="], + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "cookie": ["cookie@2.0.1", "", {}, "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w=="], + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], @@ -239,6 +304,8 @@ "execa": ["execa@10.1.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "figures": "^6.1.0", "get-stream": "^9.0.1", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.3.1", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "which-command": "^0.1.0", "yoctocolors": "^2.2.0" } }, "sha512-yJAC9ulsE6fU0K6wzJBIH+wI+KAtMeu6Ck8rs23OVzvEhqXjGADdI6K+YNIDAjcQQ6AwXTD96cKExJo6xFJXyg=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], @@ -267,10 +334,16 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], @@ -289,6 +362,14 @@ "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + "js-levenshtein": ["js-levenshtein@1.1.6", "", {}, "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], @@ -331,6 +412,8 @@ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], + "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="], "mode-watcher": ["mode-watcher@1.1.0", "", { "dependencies": { "runed": "^0.25.0", "svelte-toolbelt": "^0.7.1" }, "peerDependencies": { "svelte": "^5.27.0" } }, "sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g=="], @@ -339,6 +422,8 @@ "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "nanoid": ["nanoid@3.3.20", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ=="], "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], @@ -351,6 +436,14 @@ "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + "openapi-fetch": ["openapi-fetch@0.17.0", "", { "dependencies": { "openapi-typescript-helpers": "^0.1.0" } }, "sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig=="], + + "openapi-typescript": ["openapi-typescript@7.13.0", "", { "dependencies": { "@redocly/openapi-core": "^1.34.6", "ansi-colors": "^4.1.3", "change-case": "^5.4.4", "parse-json": "^8.3.0", "supports-color": "^10.2.2", "yargs-parser": "^21.1.1" }, "peerDependencies": { "typescript": "^5.x" }, "bin": { "openapi-typescript": "bin/cli.js" } }, "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ=="], + + "openapi-typescript-helpers": ["openapi-typescript-helpers@0.1.0", "", {}, "sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw=="], + + "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], "path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], @@ -363,6 +456,8 @@ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], + "postcss": ["postcss@8.5.30", "", { "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA=="], "pretty-ms": ["pretty-ms@9.3.1", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA=="], @@ -371,6 +466,8 @@ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "resolve.exports": ["resolve.exports@2.0.4", "", {}, "sha512-zepuGL0ulf+nt+XaFrlKeaiTJeyPFPLLY62+ncq1/VTHBdt3HsfXOH60priZ6tnXQozdGcDeIF5JVTanvIcYWQ=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -407,6 +504,8 @@ "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], + "svelte": ["svelte@5.57.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "@jridgewell/sourcemap-codec": "^1.6.0", "@sveltejs/acorn-typescript": "^1.0.13", "@types/estree": "^1.0.9", "acorn": "^8.18.0", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.9.2", "esm-env": "^1.2.1", "esrap": "^2.3.6", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-1YiPCAXT0Ct6g1vOMmSLa0Nsc3QRMvtDF32ihgglGVrugIuIK38RyDiFNXVDhtQ81TJjSO57NdMw6DyYLqSGDQ=="], "svelte-check": ["svelte-check@4.7.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "@sveltejs/load-config": "^0.2.3", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.0.0 || ^6.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw=="], @@ -437,6 +536,8 @@ "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], @@ -447,6 +548,8 @@ "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + "uri-js-replace": ["uri-js-replace@1.0.1", "", {}, "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g=="], + "vite": ["vite@8.3.4", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.29", "rolldown": "~1.2.12", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ=="], "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], @@ -457,6 +560,10 @@ "yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="], + "yaml-ast-parser": ["yaml-ast-parser@0.0.43", "", {}, "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "yoctocolors": ["yoctocolors@2.2.0", "", {}, "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg=="], "zimmerframe": ["zimmerframe@1.1.5", "", {}, "sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA=="], diff --git a/package.json b/package.json index d77a9f9..ecfd75c 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,19 @@ "@sveltejs/kit": "^3.0.1", "@sveltejs/vite-plugin-svelte": "^7.1.2", "@tailwindcss/vite": "^4.3.0", + "@tanstack/svelte-query": "^6.3.3", "@types/bun": "^1.3.0", + "@types/d3-array": "^3.2.2", + "@types/d3-scale": "^4.0.9", + "@types/d3-shape": "^3.2.0", "bits-ui": "^2.16.3", "clsx": "^2.1.1", + "d3-array": "^3.2.4", + "d3-scale": "^4.0.2", + "d3-shape": "^3.2.0", "mode-watcher": "^1.1.0", + "openapi-fetch": "^0.17.0", + "openapi-typescript": "^7.13.0", "shadcn-svelte": "^1.3.0", "svelte": "^5.57.1", "svelte-check": "^4.7.6", diff --git a/src/lib/api/client.ts b/src/lib/api/client.ts index 423b466..16686c2 100644 --- a/src/lib/api/client.ts +++ b/src/lib/api/client.ts @@ -1,56 +1,216 @@ -import { PUBLIC_API_BASE_URL } from "$app/env/public"; +import createClient, { type Middleware } from "openapi-fetch"; +import type { components, paths } from "./schema.js"; -const BASE = PUBLIC_API_BASE_URL; +export type Schemas = components["schemas"]; + +const XSRF_COOKIE = /(?:^|;\s*)XSRF-TOKEN=([^;]*)/; +const RETURN_KEY = "ffui.returnTo"; +const LOOP_GUARD_MS = 10_000; +const PING_EVERY_MS = 15 * 60_000; +const PING_STALE_MS = 5 * 60_000; + +export type SessionState = "ok" | "unauthenticated" | "mfa"; export class ApiError extends Error { status: number; + errors: Record; - constructor(status: number, message: string) { + constructor( + status: number, + message: string, + errors: Record = {} + ) { super(message); - this.status = status; this.name = "ApiError"; + this.status = status; + this.errors = errors; } } -type Json = Record | unknown[]; +export function xsrfToken(): string { + const match = document.cookie.match(XSRF_COOKIE); + return match ? decodeURIComponent(match[1]) : ""; +} -async function handle(res: Response): Promise { - if (res.status === 204) { +export function apiHeaders(json = true): Record { + const headers: Record = { + Accept: "application/json", + "X-Requested-With": "XMLHttpRequest", + "X-XSRF-TOKEN": xsrfToken(), + }; + if (json) { + headers["Content-Type"] = "application/json"; + } + return headers; +} + +let lastPing = 0; + +export async function ping(): Promise { + lastPing = Date.now(); + const res = await fetch("/json/intro/ffui", { + credentials: "same-origin", + headers: apiHeaders(false), + }); + if (res.status === 401 || res.redirected) { + return "unauthenticated"; + } + const body = await res.json().catch(() => null); + return Array.isArray(body) ? "ok" : "mfa"; +} + +export function leaveTo(state: Exclude) { + const raw = sessionStorage.getItem(RETURN_KEY); + const previous = raw ? (JSON.parse(raw) as { at: number }) : null; + if (previous && Date.now() - previous.at < LOOP_GUARD_MS) { + throw new ApiError(401, "Session expired"); + } + const path = location.pathname + location.search + location.hash; + sessionStorage.setItem(RETURN_KEY, JSON.stringify({ at: Date.now(), path })); + location.assign(state === "mfa" ? "/profile" : "/login"); +} + +export function takeReturnPath(): string | null { + const raw = sessionStorage.getItem(RETURN_KEY); + if (!raw) { + return null; + } + sessionStorage.removeItem(RETURN_KEY); + const { path } = JSON.parse(raw) as { path: string }; + return path === location.pathname + location.search ? null : path; +} + +export function keepAlive() { + const refresh = () => { + if (Date.now() - lastPing > PING_STALE_MS) { + ping().catch(() => undefined); + } + }; + const timer = setInterval(() => ping().catch(() => undefined), PING_EVERY_MS); + document.addEventListener("visibilitychange", refresh); + window.addEventListener("focus", refresh); + window.addEventListener("online", refresh); + return () => { + clearInterval(timer); + document.removeEventListener("visibilitychange", refresh); + window.removeEventListener("focus", refresh); + window.removeEventListener("online", refresh); + }; +} + +export async function logout() { + await fetch("/logout", { + credentials: "same-origin", + headers: apiHeaders(false), + method: "POST", + }); + location.assign("/login"); +} + +async function toError(res: Response): Promise { + const body = (await res + .clone() + .json() + .catch(() => null)) as { + message?: string; + errors?: Record; + } | null; + const errors: Record = {}; + for (const [key, value] of Object.entries(body?.errors ?? {})) { + errors[key] = Array.isArray(value) ? value : [value]; + } + return new ApiError(res.status, body?.message ?? res.statusText, errors); +} + +function withHeaders(request: Request): Request { + const json = !(request.body instanceof Blob) && request.method !== "GET"; + for (const [key, value] of Object.entries(apiHeaders(json))) { + if (!request.headers.has(key) || key === "X-XSRF-TOKEN") { + request.headers.set(key, value); + } + } + return request; +} + +async function recover(request: Request, response: Response) { + if (response.status !== 401) { + return response; + } + const state = await ping(); + if (state === "ok" && request.method === "GET") { + const retry = await fetch(withHeaders(request)); + if (retry.status !== 401) { + return retry; + } + } + if (state !== "ok") { + leaveTo(state); + } + return response; +} + +const auth: Middleware = { + onRequest: ({ request }) => withHeaders(request), + onResponse: ({ request, response }) => recover(request, response), +}; + +export const client = createClient({ + baseUrl: "/api", + credentials: "same-origin", +}); +client.use(auth); + +interface Result { + data?: T; + error?: unknown; + response: Response; +} + +export async function unwrap(promise: Promise>): Promise { + const { data, response } = await promise; + if (!response.ok) { + throw await toError(response); + } + return data as T; +} + +export type Query = Record; + +export function apiUrl(path: string, query: Query = {}): URL { + const url = new URL(`/api${path}`, location.origin); + for (const [key, value] of Object.entries(query)) { + for (const item of Array.isArray(value) ? value : [value]) { + if (item !== undefined && item !== null && item !== "") { + url.searchParams.append(key, String(item)); + } + } + } + return url; +} + +export async function api( + path: string, + { + query, + body, + ...init + }: Omit & { query?: Query; body?: unknown } = {} +): Promise { + const payload = + body === undefined || body instanceof Blob ? body : JSON.stringify(body); + const request = withHeaders( + new Request(apiUrl(path, query), { + credentials: "same-origin", + ...init, + body: payload as BodyInit | undefined, + }) + ); + const response = await recover(request.clone(), await fetch(request)); + if (!response.ok) { + throw await toError(response); + } + if (response.status === 204) { return undefined as T; } - if (res.ok) { - return (await res.json()) as T; - } - let detail = res.statusText; - try { - const { detail: parsed } = (await res.json()) as { detail?: string }; - if (parsed) { - detail = parsed; - } - } catch { - detail = res.statusText; - } - throw new ApiError(res.status, detail); + return (await response.json()) as T; } - -async function request( - method: string, - path: string, - body?: Json -): Promise { - const init: RequestInit = { credentials: "include", method }; - if (body !== undefined) { - init.headers = { "Content-Type": "application/json" }; - init.body = JSON.stringify(body); - } - const res = await fetch(BASE + path, init); - return handle(res); -} - -export const api = { - del: (path: string) => request("DELETE", path), - get: (path: string) => request("GET", path), - patch: (path: string, body?: Json) => request("PATCH", path, body), - post: (path: string, body?: Json) => request("POST", path, body), - put: (path: string, body?: Json) => request("PUT", path, body), -}; diff --git a/src/lib/api/lists.ts b/src/lib/api/lists.ts new file mode 100644 index 0000000..5a36ebd --- /dev/null +++ b/src/lib/api/lists.ts @@ -0,0 +1,80 @@ +import { QueryClient } from "@tanstack/svelte-query"; +import { api, type Query } from "./client.js"; +import type { + Account, + Bill, + Budget, + Category, + Item, + ObjectGroup, + Page, + PiggyBank, + Tag, +} from "./types.js"; + +const STALE_MS = 60_000; +const ALL_LIMIT = 1000; + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, + retry: 1, + staleTime: STALE_MS, + }, + }, +}); + +export async function all( + path: string, + query: Query = {} +): Promise[]> { + const first = await api>(path, { + query: { ...query, limit: ALL_LIMIT, page: 1 }, + }); + const pages = first.meta.pagination?.total_pages ?? 1; + if (pages <= 1) { + return first.data; + } + const rest = await Promise.all( + Array.from({ length: pages - 1 }, (_, i) => + api>(path, { query: { ...query, limit: ALL_LIMIT, page: i + 2 } }) + ) + ); + return [...first.data, ...rest.flatMap((page) => page.data)]; +} + +export const lists = { + accounts: (type = "all") => ({ + queryFn: () => all("/v1/accounts", { type }), + queryKey: ["accounts", type], + }), + bills: () => ({ + queryFn: () => all("/v1/bills"), + queryKey: ["bills"], + }), + budgets: () => ({ + queryFn: () => all("/v1/budgets"), + queryKey: ["budgets"], + }), + categories: () => ({ + queryFn: () => all("/v1/categories"), + queryKey: ["categories"], + }), + objectGroups: () => ({ + queryFn: () => all("/v1/object-groups"), + queryKey: ["object-groups"], + }), + piggyBanks: () => ({ + queryFn: () => all("/v1/piggy-banks"), + queryKey: ["piggy-banks"], + }), + tags: () => ({ + queryFn: () => all("/v1/tags"), + queryKey: ["tags"], + }), +}; + +export function invalidate() { + return queryClient.invalidateQueries(); +} diff --git a/src/lib/api/schema.d.ts b/src/lib/api/schema.d.ts new file mode 100644 index 0000000..dae7343 --- /dev/null +++ b/src/lib/api/schema.d.ts @@ -0,0 +1,28401 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/v1/autocomplete/accounts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all accounts of the user returned in a basic auto-complete array. */ + get: operations["getAccountsAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/bills": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all bills of the user returned in a basic auto-complete array. */ + get: operations["getBillsAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/budgets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all budgets of the user returned in a basic auto-complete array. */ + get: operations["getBudgetsAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/categories": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all categories of the user returned in a basic auto-complete array. */ + get: operations["getCategoriesAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/currencies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all currencies of the user returned in a basic auto-complete array. */ + get: operations["getCurrenciesAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/object-groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all object groups of the user returned in a basic auto-complete array. */ + get: operations["getObjectGroupsAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/piggy-banks": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all piggy banks of the user returned in a basic auto-complete array. */ + get: operations["getPiggiesAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/recurring": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all recurring transactions of the user returned in a basic auto-complete array. */ + get: operations["getRecurringAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/rule-groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all rule groups of the user returned in a basic auto-complete array. */ + get: operations["getRuleGroupsAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/rules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all rules of the user returned in a basic auto-complete array. */ + get: operations["getRulesAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/subscriptions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all subscriptions of the user returned in a basic auto-complete array. */ + get: operations["getSubscriptionsAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/tags": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all tags of the user returned in a basic auto-complete array. */ + get: operations["getTagAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/transaction-types": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all transaction types returned in a basic auto-complete array. English only. */ + get: operations["getTransactionTypesAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all transaction descriptions of the user returned in a basic auto-complete array. */ + get: operations["getTransactionsAC"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/autocomplete/transactions-with-meta": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Returns all transactions, complemented with meta information. */ + get: operations["getTransactionsWithMeta"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/chart/account/overview": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Dashboard chart with asset account balance information. + * @description This endpoint returns the data required to generate a chart with basic asset account balance information. This is used on the dashboard. + */ + get: operations["getChartAccountOverview"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/chart/balance/balance": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Dashboard chart with balance information. + * @description This endpoint returns the data required to generate a chart with balance information. + */ + get: operations["getChartBalance"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/chart/budget/overview": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Dashboard chart with budget information. + * @description This endpoint returns the data required to generate a chart with basic budget information. + */ + get: operations["getChartBudgetOverview"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/chart/budget/overview-with-limits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Dashboard chart with budget and budget limit information. + * @description This endpoint returns the data required to generate a chart with basic budget information, grouped by budget limit when necessary. + */ + get: operations["getChartBudgetOverviewWithLimits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/chart/category/overview": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Dashboard chart with category information. + * @description This endpoint returns the data required to generate a chart with basic category information. + */ + get: operations["getChartCategoryOverview"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/bulk/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Bulk update transaction properties. For more information, see https://docs.firefly-iii.org/references/firefly-iii/api/specials/ + * @description Allows you to update transactions in bulk. + */ + post: operations["bulkUpdateTransactions"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/destroy": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Endpoint to destroy user data + * @description A call to this endpoint deletes the requested data type. Use it with care and always with user permission. + * The demo user is incapable of using this endpoint. + */ + delete: operations["destroyData"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/accounts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export account data from Firefly III + * @description This endpoint allows you to export your accounts from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportAccounts"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/bills": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export bills from Firefly III + * @description This endpoint allows you to export your bills from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportBills"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/subscriptions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export subscriptions from Firefly III + * @description This endpoint allows you to export your subscriptions (also known as bills) from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportSubscriptions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/budgets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export budgets and budget amount data from Firefly III + * @description This endpoint allows you to export your budgets and associated budget data from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportBudgets"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/categories": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export category data from Firefly III + * @description This endpoint allows you to export your categories from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportCategories"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/piggy-banks": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export piggy banks from Firefly III + * @description This endpoint allows you to export your piggy banks from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportPiggies"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/recurring": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export recurring transaction data from Firefly III + * @description This endpoint allows you to export your recurring transactions from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportRecurring"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/rules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export rule groups and rule data from Firefly III + * @description This endpoint allows you to export your rules and rule groups from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportRules"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/tags": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export tag data from Firefly III + * @description This endpoint allows you to export your tags from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportTags"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/export/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Export transaction data from Firefly III + * @description This endpoint allows you to export transactions from Firefly III into a file. Currently supports CSV exports only. + */ + get: operations["exportTransactions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/data/purge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Endpoint to purge user data + * @description A call to this endpoint purges all previously deleted data. Use it with care and always with user permission. + * The demo user is incapable of using this endpoint. + */ + delete: operations["purgeData"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/expense": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, grouped by expense account. + * @description This endpoint gives a summary of the expenses made by the user, grouped by expense account. + */ + get: operations["insightExpenseExpense"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/asset": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, grouped by asset account. + * @description This endpoint gives a summary of the expenses made by the user, grouped by asset account. + */ + get: operations["insightExpenseAsset"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/income/revenue": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into income, grouped by revenue account. + * @description This endpoint gives a summary of the income received by the user, grouped by revenue account. + */ + get: operations["insightIncomeRevenue"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/income/asset": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into income, grouped by asset account. + * @description This endpoint gives a summary of the income received by the user, grouped by asset account. + */ + get: operations["insightIncomeAsset"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/transfer/asset": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into transfers, grouped by account. + * @description This endpoint gives a summary of the transfers made by the user, grouped by asset account or lability. + */ + get: operations["insightTransfers"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/bill": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, grouped by bill. + * @description This endpoint gives a summary of the expenses made by the user, grouped by (any) bill. + */ + get: operations["insightExpenseBill"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/no-bill": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, without bill. + * @description This endpoint gives a summary of the expenses made by the user, including only expenses with no bill. + */ + get: operations["insightExpenseNoBill"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/budget": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, grouped by budget. + * @description This endpoint gives a summary of the expenses made by the user, grouped by (any) budget. + */ + get: operations["insightExpenseBudget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/no-budget": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, without budget. + * @description This endpoint gives a summary of the expenses made by the user, including only expenses with no budget. + */ + get: operations["insightExpenseNoBudget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/category": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, grouped by category. + * @description This endpoint gives a summary of the expenses made by the user, grouped by (any) category. + */ + get: operations["insightExpenseCategory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/no-category": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, without category. + * @description This endpoint gives a summary of the expenses made by the user, including only expenses with no category. + */ + get: operations["insightExpenseNoCategory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/income/category": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into income, grouped by category. + * @description This endpoint gives a summary of the income received by the user, grouped by (any) category. + */ + get: operations["insightIncomeCategory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/income/no-category": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into income, without category. + * @description This endpoint gives a summary of the income received by the user, including only income with no category. + */ + get: operations["insightIncomeNoCategory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/transfer/category": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into transfers, grouped by category. + * @description This endpoint gives a summary of the transfers made by the user, grouped by (any) category. + */ + get: operations["insightTransferCategory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/transfer/no-category": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into transfers, without category. + * @description This endpoint gives a summary of the transfers made by the user, including only transfers with no category. + */ + get: operations["insightTransferNoCategory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/tag": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, grouped by tag. + * @description This endpoint gives a summary of the expenses made by the user, grouped by (any) tag. + */ + get: operations["insightExpenseTag"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/no-tag": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, without tag. + * @description This endpoint gives a summary of the expenses made by the user, including only expenses with no tag. + */ + get: operations["insightExpenseNoTag"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/income/tag": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into income, grouped by tag. + * @description This endpoint gives a summary of the income received by the user, grouped by (any) tag. + */ + get: operations["insightIncomeTag"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/income/no-tag": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into income, without tag. + * @description This endpoint gives a summary of the income received by the user, including only income with no tag. + */ + get: operations["insightIncomeNoTag"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/transfer/tag": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into transfers, grouped by tag. + * @description This endpoint gives a summary of the transfers created by the user, grouped by (any) tag. + */ + get: operations["insightTransferTag"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/transfer/no-tag": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into expenses, without tag. + * @description This endpoint gives a summary of the transfers made by the user, including only transfers with no tag. + */ + get: operations["insightTransferNoTag"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/expense/total": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into total expenses. + * @description This endpoint gives a sum of the total expenses made by the user. + */ + get: operations["insightExpenseTotal"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/income/total": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into total income. + * @description This endpoint gives a sum of the total income received by the user. + */ + get: operations["insightIncomeTotal"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/insight/transfer/total": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Insight into total transfers. + * @description This endpoint gives a sum of the total amount transfers made by the user. + */ + get: operations["insightTransferTotal"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/accounts/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions related to the account. + * @description This endpoint returns a list of all the transactions connected to the account. + */ + get: operations["listTransactionByAccount"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/accounts/{id}/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists all attachments. + * @description Lists all attachments. + */ + get: operations["listAttachmentByAccount"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/accounts/{id}/piggy-banks": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all piggy banks related to the account. + * @description This endpoint returns a list of all the piggy banks connected to the account. + */ + get: operations["listPiggyBankByAccount"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/accounts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all accounts. + * @description This endpoint returns a list of all the accounts owned by the authenticated user. + */ + get: operations["listAccount"]; + put?: never; + /** + * Create new account. + * @description Creates a new account. The data required can be submitted as a JSON body or as a list of parameters (in key=value pairs, like a webform). + */ + post: operations["storeAccount"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/accounts/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get single account. + * @description Returns a single account by its ID. + */ + get: operations["getAccount"]; + /** + * Update existing account. + * @description Used to update a single account. All fields that are not submitted will be cleared (set to NULL). The model will tell you which fields are mandatory. + */ + put: operations["updateAccount"]; + post?: never; + /** + * Permanently delete account. + * @description Will permanently delete an account. Any associated transactions and piggy banks are ALSO deleted. Cannot be recovered from. + */ + delete: operations["deleteAccount"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all attachments. + * @description This endpoint lists all attachments. + */ + get: operations["listAttachment"]; + put?: never; + /** + * Store a new attachment. + * @description Creates a new attachment. The data required can be submitted as a JSON body or as a list of parameters. You cannot use this endpoint to upload the actual file data (see below). This endpoint only creates the attachment object. + */ + post: operations["storeAttachment"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/attachments/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single attachment. + * @description Get a single attachment. This endpoint only returns the available metadata for the attachment. Actual file data is handled in two other endpoints (see below). + */ + get: operations["getAttachment"]; + /** + * Update existing attachment. + * @description Update the meta data for an existing attachment. This endpoint does not allow you to upload or download data. For that, see below. + */ + put: operations["updateAttachment"]; + post?: never; + /** + * Delete an attachment. + * @description With this endpoint you delete an attachment, including any stored file data. + */ + delete: operations["deleteAttachment"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/attachments/{id}/download": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Download a single attachment. + * @description This endpoint allows you to download the binary content of a transaction. It will be sent to you as a download, using the content type "application/octet-stream" and content disposition "attachment; filename=example.pdf". + */ + get: operations["downloadAttachment"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/attachments/{id}/upload": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Upload an attachment. + * @description Use this endpoint to upload (and possible overwrite) the file contents of an attachment. Simply put the entire file in the body as binary data. + */ + post: operations["uploadAttachment"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/available-budgets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all available budget amounts. + * @description Firefly III calculates the total amount of money budgeted in so-called "available budgets". This endpoint returns all of these amounts and the periods for which they are calculated. + */ + get: operations["listAvailableBudgets"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/available-budgets/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single available budget. + * @description Get a single available budget, by ID. + */ + get: operations["getAvailableBudget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/bills/{id}/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all attachments uploaded to the bill. + * @description This endpoint will list all attachments linked to the bill. + */ + get: operations["listAttachmentByBill"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/bills/{id}/rules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all rules associated with the bill. + * @description This endpoint will list all rules that have an action to set the bill to this bill. + */ + get: operations["listRuleByBill"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/bills/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions associated with the bill. + * @description This endpoint will list all transactions linked to this bill. + */ + get: operations["listTransactionByBill"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/bills": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all bills. + * @description This endpoint will list all the user's bills. + */ + get: operations["listBill"]; + put?: never; + /** + * Store a new bill + * @description Creates a new bill. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeBill"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/bills/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single bill. + * @description Get a single bill. + */ + get: operations["getBill"]; + /** + * Update existing bill. + * @description Update existing bill. + */ + put: operations["updateBill"]; + post?: never; + /** + * Delete a bill. + * @description Delete a bill. This will not delete any associated rules. Will not remove associated transactions. WILL remove all associated attachments. + */ + delete: operations["deleteBill"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budgets/{id}/limits/{limitId}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions by a budget limit ID. + * @description List all the transactions within one budget limit. The start and end date are dictated by the budget limit. + */ + get: operations["listTransactionByBudgetLimit"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budgets/{id}/limits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get all limits for a budget. + * @description Get all budget limits for this budget and the money spent, and money left. You can limit the list by submitting a date range as well. The "spent" array for each budget limit is NOT influenced by the start and end date of your query, but by the start and end date of the budget limit itself. + */ + get: operations["listBudgetLimitByBudget"]; + put?: never; + /** + * Store new budget limit. + * @description Store a new budget limit under this budget. + */ + post: operations["storeBudgetLimit"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budgets/{id}/limits/{limitId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get single budget limit. */ + get: operations["getBudgetLimit"]; + /** + * Update existing budget limit. + * @description Update existing budget limit. + */ + put: operations["updateBudgetLimit"]; + post?: never; + /** + * Delete a budget limit. + * @description Delete a budget limit. + */ + delete: operations["deleteBudgetLimit"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budget-limits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get list of budget limits by date + * @description Get all budget limits for for this date range. + */ + get: operations["listBudgetLimit"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budgets/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * All transactions to a budget. + * @description Get all transactions linked to a budget, possibly limited by start and end + */ + get: operations["listTransactionByBudget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budgets/{id}/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists all attachments of a budget. + * @description Lists all attachments. + */ + get: operations["listAttachmentByBudget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budgets/transactions-without-budget": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * All transactions without a budget. + * @description Get all transactions NOT linked to a budget, possibly limited by start and end + */ + get: operations["listTransactionWithoutBudget"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budgets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all budgets. + * @description List all the budgets the user has made. If the start date and end date are submitted as well, the "spent" array will be updated accordingly. + */ + get: operations["listBudget"]; + put?: never; + /** + * Store a new budget + * @description Creates a new budget. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeBudget"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/budgets/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single budget. + * @description Get a single budget. If the start date and end date are submitted as well, the "spent" array will be updated accordingly. + */ + get: operations["getBudget"]; + /** + * Update existing budget. + * @description Update existing budget. This endpoint cannot be used to set budget amount limits. + */ + put: operations["updateBudget"]; + post?: never; + /** + * Delete a budget. + * @description Delete a budget. Transactions will not be deleted. + */ + delete: operations["deleteBudget"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/categories/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions in a category. + * @description List all transactions in a category, optionally limited to the date ranges specified. + */ + get: operations["listTransactionByCategory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/categories/{id}/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists all attachments. + * @description Lists all attachments. + */ + get: operations["listAttachmentByCategory"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/categories": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all categories. + * @description List all categories. + */ + get: operations["listCategory"]; + put?: never; + /** + * Store a new category + * @description Creates a new category. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeCategory"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/categories/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single category. + * @description Get a single category. + */ + get: operations["getCategory"]; + /** + * Update existing category. + * @description Update existing category. + */ + put: operations["updateCategory"]; + post?: never; + /** + * Delete a category. + * @description Delete a category. Transactions will not be removed. + */ + delete: operations["deleteCategory"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/exchange-rates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all exchange rates that Firefly III knows. + * @description List exchange rates that Firefly III knows. + */ + get: operations["listCurrencyExchangeRates"]; + put?: never; + /** + * Store a new currency exchange rate. + * @description Stores a new exchange rate. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeCurrencyExchangeRate"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/exchange-rates/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List a single specific exchange rate. + * @description List a single specific exchange rate by its ID. + */ + get: operations["listSpecificCurrencyExchangeRate"]; + /** + * Update existing currency exchange rate. + * @description Used to update a single currency exchange rate by its ID. Including the from/to currency is optional. + */ + put: operations["updateCurrencyExchangeRate"]; + post?: never; + /** + * Delete a specific currency exchange rate. + * @description Delete a specific currency exchange rate by its internal ID. + */ + delete: operations["deleteSpecificCurrencyExchangeRate"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/exchange-rates/{from}/{to}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all exchange rates from/to the mentioned currencies. + * @description List all exchange rates from/to the mentioned currencies. + */ + get: operations["listSpecificCurrencyExchangeRates"]; + put?: never; + post?: never; + /** + * Deletes ALL currency exchange rates from 'from' to 'to'. + * @description Deletes ALL currency exchange rates from 'from' to 'to'. It's important to know that the reverse exchange rates (from 'to' to 'from') will not be deleted and Firefly III will still be able to infer the correct exchange rate from the reverse one. + */ + delete: operations["deleteSpecificCurrencyExchangeRates"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/exchange-rates/{from}/{to}/{date}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List the exchange rate for the from and to-currency on the requested date. + * @description List the exchange rate for the from and to-currency on the requested date. + */ + get: operations["listSpecificCurrencyExchangeRateOnDate"]; + /** + * Update existing currency exchange rate. + * @description Used to update a single currency exchange rate by its currency codes and date + */ + put: operations["updateCurrencyExchangeRateByDate"]; + post?: never; + /** + * Delete the currency exchange rate from 'from' to 'to' on the specified date. + * @description Delete the currency exchange rate from 'from' to 'to' on the specified date. It's important to know that the reverse exchange rate (from 'to' to 'from') will not be deleted and Firefly III will still be able to infer the correct exchange rate from the reverse one. + */ + delete: operations["deleteSpecificCurrencyExchangeRateOnDate"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/exchange-rates/by-date/{date}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Store new currency exchange rates under this date + * @description Stores a new set of exchange rates. The date is fixed (in the URL parameter) and the data required can be submitted as a JSON body. + */ + post: operations["storeCurrencyExchangeRatesByDate"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/exchange-rates/by-currencies/{from}/{to}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Store new currency exchange rates under this from/to pair. + * @description Stores a new set of exchange rates for this pair. The date is variable, and the data required can be submitted as a JSON body. + */ + post: operations["storeCurrencyExchangeRatesByPair"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/link-types/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions under this link type. + * @description List all transactions under this link type, both the inward and outward transactions. + */ + get: operations["listTransactionByLinkType"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/link-types": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all types of links. + * @description List all the link types the system has. These include the default ones as well as any new ones. + */ + get: operations["listLinkType"]; + put?: never; + /** + * Create a new link type + * @description Creates a new link type. The data required can be submitted as a JSON body or as a list of parameters (in key=value pairs, like a webform). + */ + post: operations["storeLinkType"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/link-types/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get single a link type. + * @description Returns a single link type by its ID. + */ + get: operations["getLinkType"]; + /** + * Update existing link type. + * @description Used to update a single link type. All fields that are not submitted will be cleared (set to NULL). The model will tell you which fields are mandatory. You cannot update some of the system provided link types, indicated by the editable=false flag when you list it. + */ + put: operations["updateLinkType"]; + post?: never; + /** + * Permanently delete link type. + * @description Will permanently delete a link type. The links between transactions will be removed. The transactions themselves remain. You cannot delete some of the system provided link types, indicated by the editable=false flag when you list it. + */ + delete: operations["deleteLinkType"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/transaction-links": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transaction links. + * @description List all the transaction links. + */ + get: operations["listTransactionLink"]; + put?: never; + /** + * Create a new link between transactions + * @description Store a new link between two transactions. For this end point you need the journal_id from a transaction. + */ + post: operations["storeTransactionLink"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/transaction-links/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single link. + * @description Returns a single link by its ID. + */ + get: operations["getTransactionLink"]; + /** + * Update an existing link between transactions. + * @description Used to update a single existing link. + */ + put: operations["updateTransactionLink"]; + post?: never; + /** + * Permanently delete link between transactions. + * @description Will permanently delete link. Transactions remain. + */ + delete: operations["deleteTransactionLink"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/object-groups/{id}/piggy-banks": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all piggy banks related to the object group. + * @description This endpoint returns a list of all the piggy banks connected to the object group. + */ + get: operations["listPiggyBankByObjectGroup"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/object-groups/{id}/bills": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all bills with this object group. + * @description List all bills with this object group. + */ + get: operations["listBillByObjectGroup"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/object-groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all object groups. + * @description List all object groups. + */ + get: operations["listObjectGroups"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/object-groups/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single object group. + * @description Get a single object group. + */ + get: operations["getObjectGroup"]; + /** + * Update existing object group. + * @description Update existing object group. + */ + put: operations["updateObjectGroup"]; + post?: never; + /** + * Delete a object group. + * @description Delete a object group. + */ + delete: operations["deleteObjectGroup"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/piggy-banks/{id}/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all events linked to a piggy bank. + * @description List all events linked to a piggy bank (adding and removing money). + */ + get: operations["listEventByPiggyBank"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/piggy-banks/{id}/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists all attachments. + * @description Lists all attachments. + */ + get: operations["listAttachmentByPiggyBank"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/piggy-banks/{id}/accounts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all accounts linked to a piggy bank. + * @description List all accounts linked to a piggy bank. A piggy bank can be linked to multiple accounts. + */ + get: operations["listAccountByPiggyBank"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/piggy-banks": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all piggy banks. + * @description List all piggy banks. + */ + get: operations["listPiggyBank"]; + put?: never; + /** + * Store a new piggy bank + * @description Creates a new piggy bank. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storePiggyBank"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/piggy-banks/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single piggy bank. + * @description Get a single piggy bank. + */ + get: operations["getPiggyBank"]; + /** + * Update existing piggy bank. + * @description Update existing piggy bank. + */ + put: operations["updatePiggyBank"]; + post?: never; + /** + * Delete a piggy bank. + * @description Delete a piggy bank. + */ + delete: operations["deletePiggyBank"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/recurrences/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions created by a recurring transaction. + * @description List all transactions created by a recurring transaction, optionally limited to the date ranges specified. + */ + get: operations["listTransactionByRecurrence"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/recurrences": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all recurring transactions. + * @description List all recurring transactions. + */ + get: operations["listRecurrence"]; + put?: never; + /** + * Store a new recurring transaction + * @description Creates a new recurring transaction. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeRecurrence"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/recurrences/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single recurring transaction. + * @description Get a single recurring transaction. + */ + get: operations["getRecurrence"]; + /** + * Update existing recurring transaction. + * @description Update existing recurring transaction. + */ + put: operations["updateRecurrence"]; + post?: never; + /** + * Delete a recurring transaction. + * @description Delete a recurring transaction. Transactions created by the recurring transaction will not be deleted. + */ + delete: operations["deleteRecurrence"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/recurrences/{id}/trigger": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Trigger the creation of a transaction for a specific recurring transaction + * @description Trigger the creation of a transaction for a specific recurring transaction. All recurrences have a set of future occurrences. For those moments, you can trigger the creation of the transaction. That means the transaction will be created NOW, instead of on the indicated date. The transaction will be dated to _today_. + * + * So, if you recurring transaction that occurs every Monday, you can trigger the creation of a transaction for Monday in two weeks, today. On that Monday two weeks from now, no transaction will be created. Instead, the transaction is created right now, and dated _today_. + */ + post: operations["triggerRecurrenceRecurrence"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rule-groups/{id}/rules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List rules in this rule group. + * @description List rules in this rule group. + */ + get: operations["listRuleByGroup"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rule-groups/{id}/test": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Test which transactions would be hit by the rule group. No changes will be made. + * @description Test which transactions would be hit by the rule group. No changes will be made. Limit the result if you want to. + */ + get: operations["testRuleGroup"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rule-groups/{id}/trigger": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Fire the rule group on your transactions. + * @description Fire the rule group on your transactions. Changes will be made by the rules in the rule group. Limit the result if you want to. + */ + post: operations["fireRuleGroup"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rule-groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all rule groups. + * @description List all rule groups. + */ + get: operations["listRuleGroup"]; + put?: never; + /** + * Store a new rule group. + * @description Creates a new rule group. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeRuleGroup"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rule-groups/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single rule group. + * @description Get a single rule group. This does not include the rules. For that, see below. + */ + get: operations["getRuleGroup"]; + /** + * Update existing rule group. + * @description Update existing rule group. + */ + put: operations["updateRuleGroup"]; + post?: never; + /** + * Delete a rule group. + * @description Delete a rule group. + */ + delete: operations["deleteRuleGroup"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rules/{id}/test": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Test which transactions would be hit by the rule. No changes will be made. + * @description Test which transactions would be hit by the rule. No changes will be made. Limit the result if you want to. + */ + get: operations["testRule"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rules/{id}/trigger": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Fire the rule on your transactions. + * @description Fire the rule group on your transactions. Changes will be made by the rules in the group. Limit the result if you want to. + */ + post: operations["fireRule"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all rules. + * @description List all rules. + */ + get: operations["listRule"]; + put?: never; + /** + * Store a new rule + * @description Creates a new rule. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeRule"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rules/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single rule. + * @description Get a single rule. + */ + get: operations["getRule"]; + /** + * Update existing rule. + * @description Update existing rule. + */ + put: operations["updateRule"]; + post?: never; + /** + * Delete an rule. + * @description Delete an rule. + */ + delete: operations["deleteRule"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/rules/validate-expression": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Validate an action expression. + * @description Validate an action expression as used in rule actions. Returns whether the submitted expression is valid. + * If the expression is invalid, a 422 validation error is returned instead. + */ + get: operations["validateActionExpression"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/subscriptions/{id}/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all attachments uploaded to the subscription. + * @description This endpoint will list all attachments linked to the subscription (also known as a bill). + */ + get: operations["listAttachmentBySubscription"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/subscriptions/{id}/rules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all rules associated with the subscription. + * @description This endpoint will list all rules that have an action to set the subscription (bill) to this subscription. + */ + get: operations["listRuleBySubscription"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/subscriptions/{id}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions associated with the subscription. + * @description This endpoint will list all transactions linked to this subscription (also known as a bill). + */ + get: operations["listTransactionBySubscription"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/subscriptions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all subscriptions. + * @description This endpoint will list all the user's subscriptions. Subscriptions are also known as bills, and this endpoint is an alias of `/bills`. + */ + get: operations["listSubscription"]; + put?: never; + /** + * Store a new subscription + * @description Creates a new subscription. The data required can be submitted as a JSON body or as a list of parameters. Subscriptions are also known as bills. + */ + post: operations["storeSubscription"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/subscriptions/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single subscription. + * @description Get a single subscription. Subscriptions are also known as bills. + */ + get: operations["getSubscription"]; + /** + * Update existing subscription. + * @description Update existing subscription. + */ + put: operations["updateSubscription"]; + post?: never; + /** + * Delete a subscription. + * @description Delete a subscription. This will not delete any associated rules. Will not remove associated transactions. WILL remove all associated attachments. + */ + delete: operations["deleteSubscription"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/tags/{tag}/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists all attachments. + * @description Lists all attachments. + */ + get: operations["listAttachmentByTag"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/tags/{tag}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions with this tag. + * @description List all transactions with this tag. + */ + get: operations["listTransactionByTag"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/tags": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all tags. + * @description List all of the user's tags. + */ + get: operations["listTag"]; + put?: never; + /** + * Store a new tag + * @description Creates a new tag. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeTag"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/tags/{tag}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single tag. + * @description Get a single tag. + */ + get: operations["getTag"]; + /** + * Update existing tag. + * @description Update existing tag. + */ + put: operations["updateTag"]; + post?: never; + /** + * Delete an tag. + * @description Delete an tag. + */ + delete: operations["deleteTag"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/accounts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all accounts with this currency. + * @description List all accounts with this currency. + */ + get: operations["listAccountByCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/available-budgets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all available budgets with this currency. + * @description List all available budgets with this currency. + */ + get: operations["listAvailableBudgetByCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/bills": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all bills with this currency. + * @description List all bills with this currency. + */ + get: operations["listBillByCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/budget-limits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all budget limits with this currency + * @description List all budget limits with this currency + */ + get: operations["listBudgetLimitByCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/recurrences": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all recurring transactions with this currency. + * @description List all recurring transactions with this currency. + */ + get: operations["listRecurrenceByCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/rules": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all rules with this currency. + * @description List all rules with this currency. + */ + get: operations["listRuleByCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all transactions with this currency. + * @description List all transactions with this currency. + */ + get: operations["listTransactionByCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/cer": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all exchange rates for this currency. + * @description List all currency exchange rates that have this currency as the source or destination currency. + */ + get: operations["listExchangeRatesByCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all currencies. + * @description List all currencies. + */ + get: operations["listCurrency"]; + put?: never; + /** + * Store a new currency + * @description Creates a new currency. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeCurrency"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/enable": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Enable a single currency. + * @description Enable a single currency. + */ + post: operations["enableCurrency"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/disable": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Disable a currency. + * @description Disable a currency. + */ + post: operations["disableCurrency"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}/primary": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Make currency primary currency. + * @description Make this currency the primary currency for the current financial administration. If the currency is not enabled, it will be enabled as well. + */ + post: operations["primaryCurrency"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/{code}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single currency. + * @description Get a single currency. + */ + get: operations["getCurrency"]; + /** + * Update existing currency. + * @description Update existing currency. + */ + put: operations["updateCurrency"]; + post?: never; + /** + * Delete a currency. + * @description Delete a currency. + */ + delete: operations["deleteCurrency"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/primary": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the primary currency of the current administration. + * @description Get the primary currency of the current administration. This replaces what was called "the user's default currency" although they are essentially the same. + */ + get: operations["getPrimaryCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/currencies/default": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the default (primary) currency of the current administration. + * @description Get the default currency of the current administration. This is an alias of `/currencies/primary`. + */ + get: operations["getDefaultCurrency"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/transaction-journals/{id}/links": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists all the transaction links for an individual journal (individual split). + * @description Lists all the transaction links for an individual journal (a split). Don't use the group ID, you need the actual underlying journal (the split). + */ + get: operations["listLinksByJournal"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/transaction-journals/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single transaction, based on one of the underlying transaction journals (transaction splits). + * @description Get a single transaction by underlying journal (split). + */ + get: operations["getTransactionByJournal"]; + put?: never; + post?: never; + /** + * Delete split from transaction + * @description Delete an individual journal (split) from a transaction. + */ + delete: operations["deleteTransactionJournal"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/transactions/{id}/attachments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists all attachments. + * @description Lists all attachments. + */ + get: operations["listAttachmentByTransaction"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/transactions/{id}/piggy-bank-events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists all piggy bank events. + * @description Lists all piggy bank events. + */ + get: operations["listEventByTransaction"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all the user's transactions. + * @description List all the user's transactions. + */ + get: operations["listTransaction"]; + put?: never; + /** + * Store a new transaction + * @description Creates a new transaction. The data required can be submitted as a JSON body or as a list of parameters. + */ + post: operations["storeTransaction"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/transactions/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single transaction. + * @description Get a single transaction. + */ + get: operations["getTransaction"]; + /** + * Update existing transaction. For more information, see https://docs.firefly-iii.org/references/firefly-iii/api/specials/ + * @description Update an existing transaction. + */ + put: operations["updateTransaction"]; + post?: never; + /** + * Delete a transaction. + * @description Delete a transaction. + */ + delete: operations["deleteTransaction"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/user-groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all the user groups available to this user. + * @description List all the user groups available to this user. These are essentially the 'financial administrations' that Firefly III supports. + */ + get: operations["listUserGroups"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/user-groups/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single user group. + * @description Returns a single user group by its ID. + */ + get: operations["getUserGroup"]; + /** + * Update an existing user group. + * @description Used to update a single user group. The available fields are still limited. + */ + put: operations["updateUserGroup"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/search/accounts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Search for accounts + * @description Search for accounts + */ + get: operations["searchAccounts"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/search/transactions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Search for transactions + * @description Searches through the users transactions. + */ + get: operations["searchTransactions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/search/transactions/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Count transactions matching the given filters. + * @description Returns the number of transactions that match the given meta-field filters. This is useful to check for + * existing transactions (for example to avoid duplicates) before storing new data. + */ + get: operations["countTransactions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/summary/basic": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Returns basic sums of the users data. + * @description Returns basic sums of the users data, like the net worth, spent and earned amounts. It is multi-currency, and is used in Firefly III to populate the dashboard. + */ + get: operations["getBasicSummary"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/about": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * System information end point. + * @description Returns general system information and versions of the (supporting) software. + */ + get: operations["getAbout"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/about/user": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Currently authenticated user endpoint. + * @description Returns the currently authenticated user. + */ + get: operations["getCurrentUser"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/release-notes/{version}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Release notes endpoint. + * @description Returns the release notes for a specific version of Firefly III. + */ + get: operations["getReleaseNotes"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/batch/finish": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Finish a batch of unprocessed transactions. + * @description summary: Finish a batch of unprocessed transactions. + */ + post: operations["finishBatch"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/configuration": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get Firefly III system configuration values. + * @description Returns all editable and not-editable configuration values for this Firefly III installation + */ + get: operations["getConfiguration"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/configuration/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single Firefly III system configuration value + * @description Returns one configuration variable for this Firefly III installation + */ + get: operations["getSingleConfiguration"]; + /** + * Update configuration value + * @description Set a single configuration value. Not all configuration values can be updated so the list of accepted configuration variables is small. + */ + put: operations["setConfiguration"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/cron/{cliToken}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Cron job endpoint + * @description Firefly III has one endpoint for its various cron related tasks. Send a GET to this endpoint + * to run the cron. The cron requires the CLI token to be present. The cron job will fire for all + * users. + */ + get: operations["getCron"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all users. + * @description List all the users in this instance of Firefly III. + */ + get: operations["listUser"]; + put?: never; + /** + * Store a new user + * @description Creates a new user. The data required can be submitted as a JSON body or as a list of parameters. The user will be given a random password, which they can reset using the "forgot password" function. + */ + post: operations["storeUser"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/users/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single user. + * @description Gets all info of a single user. + */ + get: operations["getUser"]; + /** + * Update an existing user's information. + * @description Update existing user. + */ + put: operations["updateUser"]; + post?: never; + /** + * Delete a user. + * @description Delete a user. You cannot delete the user you're authenticated with. This cannot be undone. Be careful. + */ + delete: operations["deleteUser"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/preferences": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all users preferences. + * @description List all of the preferences of the user. + */ + get: operations["listPreference"]; + put?: never; + /** + * Store a new preference for this user. + * @description This endpoint creates a new preference. The name and data are free-format, and entirely up to you. If the preference is not used in Firefly III itself it may not be configurable through the user interface, but you can use this endpoint to persist custom data for your own app. + */ + post: operations["storePreference"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/preferences/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Return a single preference. + * @description Return a single preference and the value. + */ + get: operations["getPreference"]; + /** + * Update preference + * @description Update a user's preference. + */ + put: operations["updatePreference"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/webhooks/{id}/messages": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get all the messages of a single webhook. + * @description When a webhook is triggered the actual message that will be send is stored in a "message". You can view and analyse these messages. + */ + get: operations["getWebhookMessages"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/webhooks/{id}/messages/{messageId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single message from a webhook. + * @description When a webhook is triggered it will store the actual content of the webhook in a webhook message. You can view and analyse a single one using this endpoint. + */ + get: operations["getSingleWebhookMessage"]; + put?: never; + post?: never; + /** + * Delete a webhook message. + * @description Delete a webhook message. Any time a webhook is triggered the message is stored before it's sent. You can delete them before or after sending. + */ + delete: operations["deleteWebhookMessage"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/webhooks/{id}/messages/{messageId}/attempts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get all the failed attempts of a single webhook message. + * @description When a webhook message fails to send it will store the failure in an "attempt". You can view and analyse these. Webhook messages that receive too many attempts (failures) will not be sent again. You must first clear out old attempts before the message can go out again. + */ + get: operations["getWebhookMessageAttempts"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/webhooks/{id}/messages/{messageId}/attempts/{attemptId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single failed attempt from a single webhook message. + * @description When a webhook message fails to send it will store the failure in an "attempt". You can view and analyse these. Webhooks messages that receive too many attempts (failures) will not be fired. You must first clear out old attempts and try again. This endpoint shows you the details of a single attempt. The ID of the attempt must match the corresponding webhook and webhook message. + */ + get: operations["getSingleWebhookMessageAttempt"]; + put?: never; + post?: never; + /** + * Delete a webhook attempt. + * @description Delete a webhook message attempt. If you delete all attempts for a webhook message, Firefly III will (once again) assume all is well with the webhook message and will try to send it again. + */ + delete: operations["deleteWebhookMessageAttempt"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/webhooks/{id}/submit": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Submit messages for a webhook. + * @description This endpoint will submit any open messages for this webhook. This is an asynchronous operation, so you can't see the result. Refresh the webhook message and/or the webhook message attempts to see the results. This may take some time if the webhook receiver is slow. + */ + post: operations["submitWebhook"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/webhooks/{id}/trigger-transaction/{transactionId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Trigger webhook for a given transaction. + * @description This endpoint will execute this webhook for a given transaction ID. This is an asynchronous operation, so you can't see the result. Refresh the webhook message and/or the webhook message attempts to see the results. This may take some time if the webhook receiver is slow. + */ + post: operations["triggerTransactionWebhook"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/webhooks": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all webhooks. + * @description List all the user's webhooks. + */ + get: operations["listWebhook"]; + put?: never; + /** + * Store a new webhook + * @description Creates a new webhook. The data required can be submitted as a JSON body or as a list of parameters. The webhook will be given a random secret. + */ + post: operations["storeWebhook"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/webhooks/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get a single webhook. + * @description Gets all info of a single webhook. + */ + get: operations["getWebhook"]; + /** + * Update existing webhook. + * @description Update an existing webhook's information. If you wish to reset the secret, submit any value as the "secret". Firefly III will take this as a hint and reset the secret of the webhook. + */ + put: operations["updateWebhook"]; + post?: never; + /** + * Delete a webhook. + * @description Delete a webhook. + */ + delete: operations["deleteWebhook"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + AccountArray: { + data: components["schemas"]["AccountRead"][]; + meta: components["schemas"]["Meta"]; + }; + AttachmentArray: { + data: components["schemas"]["AttachmentRead"][]; + meta: components["schemas"]["Meta"]; + }; + AutocompleteAccountArray: components["schemas"]["AutocompleteAccount"][]; + AutocompleteBillArray: components["schemas"]["AutocompleteBill"][]; + AutocompleteBudgetArray: components["schemas"]["AutocompleteBudget"][]; + AutocompleteCategoryArray: components["schemas"]["AutocompleteCategory"][]; + AutocompleteCurrencyArray: components["schemas"]["AutocompleteCurrency"][]; + AutocompleteCurrencyCodeArray: components["schemas"]["AutocompleteCurrencyCode"][]; + AutocompleteObjectGroupArray: components["schemas"]["AutocompleteObjectGroup"][]; + AutocompletePiggyArray: components["schemas"]["AutocompletePiggy"][]; + AutocompletePiggyBalanceArray: components["schemas"]["AutocompletePiggyBalance"][]; + AutocompleteRecurrenceArray: components["schemas"]["AutocompleteRecurrence"][]; + AutocompleteRuleArray: components["schemas"]["AutocompleteRule"][]; + AutocompleteRuleGroupArray: components["schemas"]["AutocompleteRuleGroup"][]; + AutocompleteTagArray: components["schemas"]["AutocompleteTag"][]; + AutocompleteTransactionArray: components["schemas"]["AutocompleteTransaction"][]; + AutocompleteTransactionIDArray: components["schemas"]["AutocompleteTransactionID"][]; + AutocompleteTransactionTypeArray: components["schemas"]["AutocompleteTransactionType"][]; + AutocompleteTransactionWithMetaArray: components["schemas"]["AutocompleteTransactionWithMeta"][]; + AvailableBudgetArray: { + data: components["schemas"]["AvailableBudgetRead"][]; + meta: components["schemas"]["Meta"]; + }; + BillArray: { + data: components["schemas"]["BillRead"][]; + meta: components["schemas"]["Meta"]; + }; + BudgetArray: { + data: components["schemas"]["BudgetRead"][]; + meta: components["schemas"]["Meta"]; + }; + BudgetLimitArray: { + data: components["schemas"]["BudgetLimitRead"][]; + meta: components["schemas"]["Meta"]; + }; + CategoryArray: { + data: components["schemas"]["CategoryRead"][]; + meta: components["schemas"]["Meta"]; + }; + ConfigurationArray: components["schemas"]["Configuration"][]; + CurrencyArray: { + data: components["schemas"]["CurrencyRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + CurrencyExchangeRateArray: { + data: components["schemas"]["CurrencyExchangeRateRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + LinkTypeArray: { + data: components["schemas"]["LinkTypeRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + ObjectGroupArray: { + data: components["schemas"]["ObjectGroupRead"][]; + meta: components["schemas"]["Meta"]; + }; + PiggyBankArray: { + data: components["schemas"]["PiggyBankRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + PiggyBankEventArray: { + data: components["schemas"]["PiggyBankEventRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + PreferenceArray: { + data: components["schemas"]["PreferenceRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + RecurrenceArray: { + data: components["schemas"]["RecurrenceRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + RuleArray: { + data: components["schemas"]["RuleRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + RuleGroupArray: { + data: components["schemas"]["RuleGroupRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + TagArray: { + data: components["schemas"]["TagRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + TransactionArray: { + data: components["schemas"]["TransactionRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + TransactionLinkArray: { + data: components["schemas"]["TransactionLinkRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + UserArray: { + data: components["schemas"]["UserRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + UserGroupArray: { + data: components["schemas"]["UserGroupRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + WebhookArray: { + data: components["schemas"]["WebhookRead"][]; + meta: components["schemas"]["Meta"]; + links: components["schemas"]["PageLink"]; + }; + WebhookAttemptArray: { + data: components["schemas"]["WebhookAttemptRead"][]; + meta: components["schemas"]["Meta"]; + }; + WebhookMessageArray: { + data: components["schemas"]["WebhookMessageRead"][]; + meta: components["schemas"]["Meta"]; + }; + AutocompleteAccount: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the account found by an auto-complete search. + * @example Checking Account + */ + name: string; + /** + * Format: string + * @description Asset accounts and liabilities have a second field with the given date's account balance in the account currency or primary currency. + * @example Checking Account ($123.45) + */ + name_with_balance: string; + /** + * @description Is the account active or not? + * @example true + */ + active: boolean; + /** + * Format: string + * @description Account type of the account found by the auto-complete search. + * @example Asset account + */ + type: string; + /** + * Format: string + * @description ID for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + * @example 12 + */ + currency_id: string; + /** + * Format: string + * @description Currency name for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + * @example Euro + */ + currency_name: string; + /** + * Format: string + * @description Currency code for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + * @example EUR + */ + currency_code: string; + /** + * Format: string + * @description Currency symbol for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + * @example $ + */ + currency_symbol: string; + /** + * Format: int32 + * @description Number of decimal places for the currency used by this account. If the user prefers amounts converted to their primary currency, this primary currency is used instead. + * @example 2 + */ + currency_decimal_places: number; + /** + * Format: string + * @description ID for the currency used by this account. Even if "convertToPrimary" is on, the account currency ID is displayed here. + * @example 2 + */ + account_currency_id: string; + /** + * Format: string + * @description Name for the currency used by this account. Even if "convertToPrimary" is on, the account currency name is displayed here. + * @example US Dollar + */ + account_currency_name: string; + /** + * Format: string + * @description Code for the currency used by this account. Even if "convertToPrimary" is on, the account currency code is displayed here. + * @example USD + */ + account_currency_code: string; + /** + * Format: string + * @description Code for the currency used by this account. Even if "convertToPrimary" is on, the account currency code is displayed here. + * @example $ + */ + account_currency_symbol: string; + /** + * Format: int32 + * @description Number of decimal places for the currency used by this account. Even if "convertToPrimary" is on, the account currency code is displayed here. + * @example 2 + */ + account_currency_decimal_places: number; + }; + AutocompleteBill: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the bill found by an auto-complete search. + * @example Yearly bill + */ + name: string; + /** + * @description Is the bill active or not? + * @example true + */ + active: boolean; + }; + AutocompleteBudget: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the budget found by an auto-complete search. + * @example Groceries + */ + name: string; + /** + * @description Is the budget active or not? + * @example true + */ + active: boolean; + }; + AutocompleteCategory: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the category found by an auto-complete search. + * @example Category X + */ + name: string; + }; + AutocompleteCurrency: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Currency name. + * @example Currency name + */ + name: string; + /** + * Format: string + * @description Currency code. + * @example EUR + */ + code: string; + /** + * Format: string + * @example $ + */ + symbol: string; + /** + * Format: int32 + * @example 2 + */ + decimal_places: number; + }; + AutocompleteCurrencyCode: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Currency name with the code between brackets. + * @example Currency name (XCN) + */ + name: string; + /** + * Format: string + * @description Currency code. + * @example EUR + */ + code: string; + /** + * Format: string + * @example $ + */ + symbol: string; + /** + * Format: int32 + * @example 2 + */ + decimal_places: number; + }; + AutocompleteObjectGroup: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Title of the object group found by an auto-complete search. + * @example Object Group one + */ + name: string; + /** + * Format: string + * @description Title of the object group found by an auto-complete search. + * @example Object Group one + */ + title: string; + }; + AutocompletePiggy: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the piggy bank found by an auto-complete search. + * @example New couch + */ + name: string; + /** + * Format: string + * @description Currency ID for this piggy bank. This will always be the currency of the piggy bank, never the user's primary currency. + * @example 12 + */ + currency_id?: string; + /** + * Format: string + * @description Currency code for this piggy bank. This will always be the currency of the piggy bank, never the user's primary currency. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + currency_symbol?: string; + /** + * Format: string + * @description Currency name for the currency used by this piggy bank. This will always be the currency of the piggy bank, never the user's primary currency. + * @example Euro + */ + currency_name?: string; + /** + * Format: int32 + * @description Number of decimal places for the currency used by this piggy bank. This will always be the currency of the piggy bank, never the user's primary currency. + * @example 2 + */ + currency_decimal_places?: number; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + }; + AutocompletePiggyBalance: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the piggy bank found by an auto-complete search. + * @example New couch + */ + name: string; + /** + * Format: string + * @description Name of the piggy bank found by an auto-complete search, including the currently saved amount and the target amount. + * @example New couch ($234.56 / $600) + */ + name_with_balance?: string; + /** + * Format: string + * @description Currency ID for the currency used by this piggy bank. This will always be the piggy bank's currency, never the primary currency. + * @example 12 + */ + currency_id?: string; + /** + * Format: string + * @description Currency code for the currency used by this piggy bank. This will always be the piggy bank's currency, never the primary currency. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @description Currency symbol for the currency used by this piggy bank. This will always be the piggy bank's currency, never the primary currency. + * @example $ + */ + currency_symbol?: string; + /** + * Format: int32 + * @description Currency decimal places for the currency used by this piggy bank. This will always be the piggy bank's currency, never the primary currency. + * @example 2 + */ + currency_decimal_places?: number; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + }; + AutocompleteRecurrence: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the recurrence found by an auto-complete search. + * @example Yearly bill + */ + name: string; + /** + * Format: string + * @description Description of the recurrence found by auto-complete. + * @example Should trigger daily. + */ + description?: string; + /** + * @description Is the recurring transaction active or not? + * @example true + */ + active?: boolean; + }; + AutocompleteRule: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the rule found by an auto-complete search. + * @example Rule one + */ + name: string; + /** + * Format: string + * @description Description of the rule found by auto-complete. + * @example Useful rule. + */ + description?: string; + /** + * @description Is the bill active or not? + * @example true + */ + active?: boolean; + }; + AutocompleteRuleGroup: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the rule group found by an auto-complete search. + * @example Rule group one + */ + name: string; + /** + * Format: string + * @description Description of the rule group found by auto-complete. + * @example Some rule group. + */ + description?: string; + /** + * @description Is the bill active or not? + * @example true + */ + active?: boolean; + }; + AutocompleteTag: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Name of the tag found by an auto-complete search. + * @example too-expensive-tag-example + */ + name: string; + /** + * Format: string + * @description Name of the tag found by an auto-complete search. + * @example too-expensive-tag-example + */ + tag: string; + }; + AutocompleteTransaction: { + /** + * Format: string + * @description The ID of a transaction journal (basically a single split). + * @example 2 + */ + id: string; + /** + * Format: string + * @description The ID of the underlying transaction group. + * @example 2 + */ + transaction_group_id?: string; + /** + * Format: string + * @description Transaction description + * @example Transaction + */ + name: string; + /** + * Format: string + * @description Transaction description + * @example Transaction + */ + description: string; + }; + AutocompleteTransactionID: { + /** + * Format: string + * @description The ID of a transaction journal (basically a single split). + * @example 2 + */ + id: string; + /** + * Format: string + * @description The ID of the underlying transaction group. + * @example 2 + */ + transaction_group_id?: string; + /** + * Format: string + * @description Transaction description with ID in the name. + * @example #12: Transaction + */ + name: string; + /** + * Format: string + * @description Transaction description with ID in the name. + * @example #12: Transaction + */ + description: string; + }; + AutocompleteTransactionType: { + /** + * Format: string + * @example 2 + */ + id: string; + /** + * Format: string + * @description Type of the object found by an auto-complete search. + * @example Withdrawal + */ + name: string; + /** + * Format: string + * @description Name of the object found by an auto-complete search. + * @example Withdrawal + */ + type: string; + }; + AutocompleteTransactionWithMeta: { + /** + * Format: string + * @description The ID of a transaction journal (basically a single split). + * @example 2 + */ + id: string; + /** + * Format: string + * @description The ID of the underlying transaction group. + * @example 2 + */ + transaction_group_id?: string; + /** + * Format: string + * @description Transaction description with ID in the name. + * @example #12: Transaction + */ + name: string; + /** + * Format: string + * @description Transaction description with ID in the name. + * @example #12: Transaction + */ + description: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + date?: string; + /** + * Format: string + * @description Currency code. + * @example EUR + */ + currency_code?: string; + /** + * Format: amount + * @description The amount that was paid for this subscription in the subscription's currency. + * @example 123.45 + */ + amount?: string; + }; + ChartDataPoint: { + /** + * Format: string + * @description The key is the label of the value, so for example: '2018-01-01' => 13 or 'Groceries' => -123. + * @example value + */ + key?: string; + }; + ChartDataSet: { + /** + * Format: string + * @description This is the title of the current set. It can refer to an account, a budget or another object (by name). + * @example Checking account + */ + label?: string; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + date?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + start_date?: string; + /** + * Format: date-time + * @example 2026-10-31T23:59:59+00:00 + */ + end_date?: string; + /** + * Format: string + * @description Indicated the type of chart that is expected to be rendered. You can safely ignore this if you want. + * @example line + */ + type?: string; + period?: components["schemas"]["ChartDatasetPeriodProperty"]; + /** + * Format: int32 + * @description Used to indicate the Y axis for this data set. Is usually between 0 and 1 (left and right side of the chart). + * @example 0 + */ + yAxisID?: number; + /** @description The actual entries for this data set. They 'key' value is the label for the data point. The value is the actual (numerical) value. */ + entries?: Record; + /** @description The actual entries for this data set. They 'key' value is the label for the data point. The value is the actual (numerical) value. */ + pc_entries?: Record; + }; + ChartLine: components["schemas"]["ChartDataSet"][]; + /** @enum {string} */ + DataDestroyObject: "not_assets_liabilities" | "budgets" | "bills" | "piggy_banks" | "rules" | "recurring" | "categories" | "tags" | "object_groups" | "accounts" | "asset_accounts" | "expense_accounts" | "revenue_accounts" | "liabilities" | "transactions" | "withdrawals" | "deposits" | "transfers"; + /** @enum {string} */ + AccountSearchFieldFilter: "all" | "iban" | "name" | "number" | "id"; + /** + * @description Title of the configuration value. + * @example configuration.is_demo_site + * @enum {string} + */ + ConfigValueFilter: "configuration.is_demo_site" | "configuration.permission_update_check" | "configuration.last_update_check" | "configuration.single_user_mode" | "firefly.version" | "firefly.default_location" | "firefly.account_to_transaction" | "firefly.allowed_opposing_types" | "firefly.accountRoles" | "firefly.valid_liabilities" | "firefly.interest_periods" | "firefly.enable_external_map" | "firefly.expected_source_types" | "app.timezone" | "firefly.bill_periods" | "firefly.credit_card_types" | "firefly.languages" | "firefly.valid_view_ranges" | "cer.enabled" | "firefly.preselected_accounts" | "firefly.rule-actions" | "firefly.context-rule-actions" | "search.operators" | "webhook.triggers" | "webhook.responses" | "webhook.deliveries"; + /** @enum {string} */ + ConfigValueUpdateFilter: "configuration.is_demo_site" | "configuration.permission_update_check" | "configuration.last_update_check" | "configuration.single_user_mode" | "configuration.enable_exchange_rates" | "configuration.use_running_balance" | "configuration.enable_external_map" | "configuration.enable_external_rates" | "configuration.allow_webhooks" | "configuration.valid_url_protocols"; + /** @enum {string} */ + ExportFileFilter: "csv"; + InsightGroup: components["schemas"]["InsightGroupEntry"][]; + InsightGroupEntry: { + /** + * Format: string + * @description This ID is a reference to the original object. + * @example 123 + */ + id?: string; + /** + * Format: string + * @description This is the name of the object. + * @example Land lord + */ + name?: string; + /** + * Format: string + * @description The amount spent or earned between start date and end date, a number defined as a string, for this object and all asset accounts. + * @example -123.45 + */ + difference?: string; + /** + * Format: double + * @description The amount spent or earned between start date and end date, a number as a float, for this object and all asset accounts. May have rounding errors. + * @example -123.45 + */ + difference_float?: number; + /** + * Format: string + * @description The currency ID of the expenses listed for this account. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency code of the expenses listed for this account. + * @example EUR + */ + currency_code?: string; + }; + InsightTotal: components["schemas"]["InsightTotalEntry"][]; + InsightTotalEntry: { + /** + * Format: string + * @description The amount spent between start date and end date, defined as a string, for this expense account and all asset accounts. + * @example 123.45 + */ + difference?: string; + /** + * Format: double + * @description The amount spent between start date and end date, defined as a string, for this expense account and all asset accounts. This number is a float (double) and may have rounding errors. + * @example 123.45 + */ + difference_float?: number; + /** + * Format: string + * @description The currency ID of the expenses listed for this expense account. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency code of the expenses listed for this expense account. + * @example EUR + */ + currency_code?: string; + }; + InsightTransfer: components["schemas"]["InsightTransferEntry"][]; + InsightTransferEntry: { + /** + * Format: string + * @description This ID is a reference to the original object. + * @example 123 + */ + id?: string; + /** + * Format: string + * @description This is the name of the object. + * @example Land lord + */ + name?: string; + /** + * Format: string + * @description The total amount transferred between start date and end date, a number defined as a string, for this asset account. + * @example -123.45 + */ + difference?: string; + /** + * Format: double + * @description The total amount transferred between start date and end date, a number as a float, for this asset account. May have rounding errors. + * @example -123.45 + */ + difference_float?: number; + /** + * Format: string + * @description The total amount transferred TO this account between start date and end date, a number defined as a string, for this asset account. + * @example 123.45 + */ + in?: string; + /** + * Format: double + * @description The total amount transferred FROM this account between start date and end date, a number as a float, for this asset account. May have rounding errors. + * @example 123.45 + */ + in_float?: number; + /** + * Format: string + * @description The total amount transferred FROM this account between start date and end date, a number defined as a string, for this asset account. + * @example 123.45 + */ + out?: string; + /** + * Format: double + * @description The total amount transferred TO this account between start date and end date, a number as a float, for this asset account. May have rounding errors. + * @example 123.45 + */ + out_float?: number; + /** + * Format: string + * @description The currency ID of the expenses listed for this account. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency code of the expenses listed for this account. + * @example EUR + */ + currency_code?: string; + }; + CategoryRead: { + /** + * Format: string + * @description Immutable value + * @example categories + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["CategoryProperties"]; + }; + CategorySingle: { + data: components["schemas"]["CategoryRead"]; + }; + ConfigurationSingle: { + data: components["schemas"]["Configuration"]; + }; + CurrencyRead: { + /** + * Format: string + * @description Immutable value + * @example currencies + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["CurrencyProperties"]; + }; + CurrencySingle: { + data: components["schemas"]["CurrencyRead"]; + }; + LinkTypeRead: { + /** + * Format: string + * @description Immutable value + * @example link_types + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["LinkType"]; + links: components["schemas"]["ObjectLink"]; + }; + LinkTypeSingle: { + data: components["schemas"]["LinkTypeRead"]; + }; + ObjectGroupRead: { + /** + * Format: string + * @description Immutable value + * @example object_groups + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["ObjectGroup"]; + }; + ObjectGroupSingle: { + data: components["schemas"]["ObjectGroupRead"]; + }; + PiggyBankEventRead: { + /** + * Format: string + * @description Immutable value + * @example piggy_bank_events + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["PiggyBankEventProperties"]; + links: components["schemas"]["ObjectLink"]; + }; + PiggyBankRead: { + /** + * Format: string + * @description Immutable value + * @example piggy_banks + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["PiggyBankProperties"]; + links: components["schemas"]["ObjectLink"]; + }; + PiggyBankSingle: { + data: components["schemas"]["PiggyBankRead"]; + }; + PreferenceRead: { + /** + * Format: string + * @description Immutable value + * @example preferences + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["Preference"]; + }; + PreferenceSingle: { + data: components["schemas"]["PreferenceRead"]; + }; + RecurrenceRead: { + /** + * Format: string + * @description Immutable value + * @example recurrences + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["RecurrenceProperties"]; + links: components["schemas"]["ObjectLink"]; + }; + RecurrenceSingle: { + data: components["schemas"]["RecurrenceRead"]; + }; + RuleGroupRead: { + /** + * Format: string + * @description Immutable value + * @example rules_group + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["RuleGroup"]; + links: components["schemas"]["ObjectLink"]; + }; + RuleGroupSingle: { + data: components["schemas"]["RuleGroupRead"]; + }; + RuleRead: { + /** + * Format: string + * @description Immutable value + * @example rules + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["Rule"]; + links: components["schemas"]["ObjectLink"]; + }; + RuleSingle: { + data: components["schemas"]["RuleRead"]; + }; + TagRead: { + /** + * Format: string + * @description Immutable value + * @example tags + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["TagModel"]; + links: components["schemas"]["ObjectLink"]; + }; + TagSingle: { + data: components["schemas"]["TagRead"]; + }; + TransactionLinkRead: { + /** + * Format: string + * @description Immutable value + * @example transactionLinks + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["TransactionLink"]; + links: components["schemas"]["ObjectLink"]; + }; + TransactionLinkSingle: { + data: components["schemas"]["TransactionLinkRead"]; + }; + TransactionRead: { + /** + * Format: string + * @description Immutable value + * @example transactions + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["Transaction"]; + links: components["schemas"]["ObjectLink"]; + }; + TransactionSingle: { + data: components["schemas"]["TransactionRead"]; + }; + UserRead: { + /** + * Format: string + * @description Immutable value + * @example users + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["User"]; + links: components["schemas"]["ObjectLink"]; + }; + WebhookAttemptRead: { + /** + * Format: string + * @description Immutable value + * @example webhook_attempts + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["WebhookAttempt"]; + }; + WebhookAttemptSingle: { + data: components["schemas"]["WebhookAttemptRead"]; + }; + WebhookMessageRead: { + /** + * Format: string + * @description Immutable value + * @example webhook_messages + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["WebhookMessage"]; + }; + WebhookMessageSingle: { + data: components["schemas"]["WebhookMessageRead"]; + }; + WebhookRead: { + /** + * Format: string + * @description Immutable value + * @example webhooks + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["WebhookProperties"]; + links: components["schemas"]["ObjectLink"]; + }; + WebhookSingle: { + data: components["schemas"]["WebhookRead"]; + }; + AccountProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * @default true + * @example false + */ + active: boolean; + /** + * Format: int32 + * @description Order of the account. Is NULL if account is not asset or liability. + * @example 1 + */ + order?: number | null; + /** + * Format: string + * @example My checking account + */ + name: string; + type: components["schemas"]["ShortAccountTypeProperty"]; + account_role?: components["schemas"]["AccountRoleProperty"]; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: int32 + * @description The order of the group. At least 1, for the highest sorting. + * @example 5 + */ + readonly object_group_order?: number | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + /** + * @description Indicates whether the account has a currency setting. If false, the account uses the administration's primary currency. Asset accounts and liability accounts always have a currency setting, while expense and revenue accounts do not. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: amount + * @description The current balance of the account in the account's currency. If the account has no currency, this is the balance in the administration's primary currency. Either way, the `currency_*` fields reflect the currency used. + * @example 123.45 + */ + readonly current_balance?: string; + /** + * Format: amount + * @description The current balance of the account in the administration's primary currency. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings. + * @example 123.45 + */ + readonly pc_current_balance?: string | null; + /** + * Format: amount + * @description If you submit a start AND end date, this will be the difference between those two moments. + * @example 123.45 + */ + readonly balance_difference?: string; + /** + * Format: amount + * @description If you submit a start AND end date, this will be the difference in the currency of the account or the administration's primary currency between those two moments. + * @example 123.45 + */ + readonly pc_balance_difference?: string | null; + /** + * Format: amount + * @description Represents the opening balance, the initial amount this account holds in the currency of the account or the administration's primary currency if the account has no currency. Either way, the `currency_*` fields reflect the currency used. + * @example -1012.12 + */ + opening_balance?: string; + /** + * Format: amount + * @description The opening balance of the account in the administration's primary currency (pc). The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings. + * @example -1012.12 + */ + pc_opening_balance?: string; + /** + * Format: amount + * @description The virtual balance of the account in the account's currency or the administration's primary currency if the account has no currency. + * @example 123.45 + */ + virtual_balance?: string; + /** + * Format: amount + * @description The virtual balance of the account in the administration's primary currency (pc). The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings. + * @example 123.45 + */ + pc_virtual_balance?: string; + /** + * Format: amount + * @description In liability accounts (loans, debts and mortgages), this is the amount of debt in the account's currency (see the `currency_*` fields). In asset accounts, this is NULL. + * @example 1012.12 + */ + debt_amount?: string | null; + /** + * Format: amount + * @description In liability accounts (loans, debts and mortgages), this is the amount of debt in the administration's primary currency (see the `currency_*` fields. In asset accounts, this is NULL. + * @example 1012.12 + */ + pc_debt_amount?: string | null; + /** + * Format: date-time + * @description The timestamp for this date is always 23:59:59, to indicate it's the balance at the very END of that particular day. + * @example 2026-10-31T23:59:59+00:00 + */ + readonly current_balance_date?: string; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: date-time + * @description Mandatory when the account_role is ccAsset. Moment at which CC payment installments are asked for by the bank. + * @example 2026-10-01T00:00:00+00:00 + */ + monthly_payment_date?: string | null; + credit_card_type?: components["schemas"]["CreditCardTypeProperty"]; + /** + * Format: string + * @example 7009312345678 + */ + account_number?: string | null; + /** + * Format: iban + * @example GB98MIDL07009312345678 + */ + iban?: string | null; + /** + * Format: string + * @example BOFAUS3N + */ + bic?: string | null; + /** + * Format: date-time + * @description Represents the date of the opening balance. + * @example 2026-10-01T00:00:00+00:00 + */ + opening_balance_date?: string | null; + liability_type?: components["schemas"]["LiabilityTypeProperty"]; + liability_direction?: components["schemas"]["LiabilityDirectionProperty"]; + /** + * Format: string + * @description Mandatory when type is liability. Interest percentage. + * @example 5.3 + */ + interest?: string | null; + interest_period?: components["schemas"]["InterestPeriodProperty"]; + /** + * @default true + * @example true + */ + include_net_worth: boolean; + /** + * Format: double + * @description Latitude of the accounts's location, if applicable. Can be used to draw a map. + * @example 5.916667 + */ + longitude?: number | null; + /** + * Format: double + * @description Latitude of the accounts's location, if applicable. Can be used to draw a map. + * @example 51.983333 + */ + latitude?: number | null; + /** + * Format: int32 + * @description Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels. + * @example 6 + */ + zoom_level?: number | null; + /** + * Format: date-time + * @description Last activity of the account. + * @example 2026-10-01T00:00:00+00:00 + */ + last_activity?: string | null; + }; + AccountRead: { + /** + * Format: string + * @description Immutable value + * @example accounts + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["AccountProperties"]; + }; + AccountSingle: { + data: components["schemas"]["AccountRead"]; + }; + AccountStore: { + /** + * Format: string + * @example My checking account + */ + name: string; + type: components["schemas"]["ShortAccountTypeProperty"]; + /** + * Format: iban + * @example GB98MIDL07009312345678 + */ + iban?: string | null; + /** + * Format: string + * @example BOFAUS3N + */ + bic?: string | null; + /** + * Format: string + * @example 7009312345678 + */ + account_number?: string | null; + /** + * Format: amount + * @description Represents the opening balance, the initial amount this account holds. + * @example -1012.12 + */ + opening_balance?: string; + /** + * Format: date-time + * @description Represents the date of the opening balance. + * @example 2026-10-01T00:00:00+00:00 + */ + opening_balance_date?: string | null; + /** + * Format: amount + * @example 123.45 + */ + virtual_balance?: string; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's financial administration's currency. + * @example 12 + */ + currency_id?: string; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's financial administration's currency. + * @example EUR + */ + currency_code?: string; + /** + * @description If omitted, defaults to true. + * @default true + * @example false + */ + active: boolean; + /** + * Format: int32 + * @description Order of the account + * @example 1 + */ + order?: number; + /** + * @description If omitted, defaults to true. + * @default true + * @example true + */ + include_net_worth: boolean; + account_role?: components["schemas"]["AccountRoleProperty"]; + credit_card_type?: components["schemas"]["CreditCardTypeProperty"]; + /** + * Format: date-time + * @description Mandatory when the account_role is ccAsset. Moment at which CC payment installments are asked for by the bank. + * @example 2026-10-01T00:00:00+00:00 + */ + monthly_payment_date?: string | null; + liability_type?: components["schemas"]["LiabilityTypeProperty"]; + liability_direction?: components["schemas"]["LiabilityDirectionProperty"]; + /** + * Format: string + * @description Mandatory when type is liability. Interest percentage. + * @default 0 + * @example 5.3 + */ + interest: string | null; + interest_period?: components["schemas"]["InterestPeriodProperty"]; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: double + * @description Latitude of the accounts's location, if applicable. Can be used to draw a map. + * @example 51.983333 + */ + latitude?: number | null; + /** + * Format: double + * @description Latitude of the accounts's location, if applicable. Can be used to draw a map. + * @example 5.916667 + */ + longitude?: number | null; + /** + * Format: int32 + * @description Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels. + * @example 6 + */ + zoom_level?: number | null; + }; + AccountUpdate: { + /** + * Format: string + * @example My checking account + */ + name: string; + /** + * Format: iban + * @example GB98MIDL07009312345678 + */ + iban?: string | null; + /** + * Format: string + * @example BOFAUS3N + */ + bic?: string | null; + /** + * Format: string + * @example 7009312345678 + */ + account_number?: string | null; + /** + * Format: amount + * @example -1012.12 + */ + opening_balance?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + opening_balance_date?: string | null; + /** + * Format: amount + * @example 123.45 + */ + virtual_balance?: string; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's financial administration's currency. + * @example 12 + */ + currency_id?: string; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's financial administration's currency. + * @example EUR + */ + currency_code?: string; + /** + * @description If omitted, defaults to true. + * @default true + * @example false + */ + active: boolean; + /** + * Format: int32 + * @description Order of the account + * @example 1 + */ + order?: number; + /** + * @description If omitted, defaults to true. + * @default true + * @example true + */ + include_net_worth: boolean; + account_role?: components["schemas"]["AccountRoleProperty"]; + credit_card_type?: components["schemas"]["CreditCardTypeProperty"]; + /** + * Format: date-time + * @description Mandatory when the account_role is ccAsset. Moment at which CC payment installments are asked for by the bank. + * @example 2026-10-01T00:00:00+00:00 + */ + monthly_payment_date?: string | null; + liability_type?: components["schemas"]["LiabilityTypeProperty"]; + /** + * Format: string + * @description Mandatory when type is liability. Interest percentage. + * @example 5.3 + */ + interest?: string | null; + interest_period?: components["schemas"]["InterestPeriodProperty"]; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: double + * @description Latitude of the account's location, if applicable. Can be used to draw a map. If omitted, the existing location will be kept. If submitted as NULL, the current location will be removed. + * @example 51.983333 + */ + latitude?: number | null; + /** + * Format: double + * @description Latitude of the account's location, if applicable. Can be used to draw a map. If omitted, the existing location will be kept. If submitted as NULL, the current location will be removed. + * @example 5.916667 + */ + longitude?: number | null; + /** + * Format: int32 + * @description Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels. If omitted, the existing location will be kept. If submitted as NULL, the current location will be removed. + * @example 6 + */ + zoom_level?: number | null; + }; + ArrayEntryWithCurrencyAndSum: { + /** + * Format: string + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @example USD + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + currency_symbol?: string; + /** + * Format: int32 + * @description Number of decimals supported by the currency + * @example 2 + */ + currency_decimal_places?: number; + /** + * Format: amount + * @description The amount earned, spent or transferred. + * @example 123.45 + */ + sum?: string; + }; + AttachmentProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + attachable_type?: components["schemas"]["AttachableType"]; + /** + * Format: string + * @description ID of the model this attachment is linked to. + * @example 134 + */ + attachable_id?: string; + /** + * Format: string + * @description Hash of the file for basic duplicate detection. + * @example 0c3f95f34370baa88f9fd9a671fea305 + */ + hash?: string; + /** + * Format: string + * @example file.pdf + */ + filename?: string; + /** + * Format: string + * @example https://demo.firefly-iii.org/api/v1/attachments/191/download + */ + download_url?: string; + /** + * Format: string + * @example https://demo.firefly-iii.org/api/v1/attachments/191/download + */ + upload_url?: string; + /** + * Format: string + * @example Some PDF file + */ + title?: string | null; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + /** + * Format: string + * @example application/pdf + */ + readonly mime?: string; + /** + * Format: int32 + * @example 48211 + */ + readonly size?: number; + }; + AttachmentRead: { + /** + * Format: string + * @description Immutable value + * @example attachments + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["AttachmentProperties"]; + links: components["schemas"]["ObjectLink"]; + }; + AttachmentSingle: { + data: components["schemas"]["AttachmentRead"]; + }; + AttachmentStore: { + /** + * Format: string + * @example file.pdf + */ + filename: string; + attachable_type: components["schemas"]["AttachableType"]; + /** + * Format: string + * @description ID of the model this attachment is linked to. + * @example 134 + */ + attachable_id: string; + /** + * Format: string + * @example Some PDF file + */ + title?: string; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + }; + AttachmentUpdate: { + /** + * Format: string + * @example file.pdf + */ + filename?: string; + /** + * Format: string + * @example Some PDF file + */ + title?: string; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + }; + AvailableBudgetProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * @description Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: amount + * @description The amount of this available budget in the currency of this available budget. + * @example 123.45 + */ + amount?: string; + /** + * Format: amount + * @description The amount of this available budget in the primary currency (pc) of this administration. + * @example 123.45 + */ + pc_amount?: string; + /** + * Format: date-time + * @description Start date of the available budget. + * @example 2026-10-01T00:00:00+00:00 + */ + start?: string; + /** + * Format: date-time + * @description End date of the available budget. + * @example 2026-10-31T23:59:59+00:00 + */ + end?: string; + readonly spent_in_budgets?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description The amount spent in budgets in the primary currency (pc) of this administration. */ + readonly pc_spent_in_budgets?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + readonly spent_outside_budgets?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description The amount spent outside of budgets in the primary currency (pc) of this administration. */ + readonly pc_spent_outside_budgets?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + }; + AvailableBudgetRead: { + /** + * Format: string + * @description Immutable value + * @example available_budgets + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["AvailableBudgetProperties"]; + }; + AvailableBudgetSingle: { + data: components["schemas"]["AvailableBudgetRead"]; + }; + BillProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @description The name of the subscription. + * @example Rent + */ + name?: string; + /** + * @description Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: amount + * @description The minimum amount that is expected for this subscription in the subscription's currency. + * @example 123.45 + */ + amount_min?: string; + /** + * Format: amount + * @description The minimum amount that is expected for this subscription in the administration's primary currency. + * @example 123.45 + */ + pc_amount_min?: string; + /** + * Format: amount + * @description The maximum amount that is expected for this subscription in the subscription's currency. + * @example 123.45 + */ + amount_max?: string; + /** + * Format: amount + * @description The maximum amount that is expected for this subscription in the administration's primary currency. + * @example 123.45 + */ + pc_amount_max?: string; + /** + * Format: amount + * @description The average amount that is expected for this subscription in the subscription's currency. + * @example 123.45 + */ + amount_avg?: string; + /** + * Format: amount + * @description The average amount that is expected for this subscription in the administration's primary currency. + * @example 123.45 + */ + pc_amount_avg?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + date?: string; + /** + * Format: date-time + * @description The date after which this subscription is no longer valid or applicable + * @example 2026-10-31T23:59:59+00:00 + */ + end_date?: string | null; + /** + * Format: date-time + * @description The date before which the subscription must be renewed (or cancelled) + * @example 2026-10-31T23:59:59+00:00 + */ + extension_date?: string | null; + repeat_freq?: components["schemas"]["BillRepeatFrequency"]; + /** + * Format: int32 + * @description How often the subscription will be skipped. 1 means a bi-monthly subscription. + * @example 0 + */ + skip?: number; + /** + * @description If the subscription is active. + * @example true + */ + active?: boolean; + /** + * Format: int32 + * @description Order of the subscription. + * @example 1 + */ + order?: number; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: int32 + * @description The order of the group. At least 1, for the highest sorting. + * @example 5 + */ + readonly object_group_order?: number | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + /** @description Array of past transactions when the subscription was paid. */ + readonly paid_dates?: { + /** + * Format: string + * @description Transaction group ID of the transaction linked to this subscription. + * @example 123 + */ + readonly transaction_group_id?: string; + /** + * Format: string + * @description Transaction journal ID of the transaction linked to this subscription. + * @example 123 + */ + readonly transaction_journal_id?: string; + /** + * Format: date-time + * @description Date the bill was paid. + * @example 2026-10-01T00:00:00+00:00 + */ + readonly date?: string; + /** + * Format: string + * @description ID of this subscription. + * @example 123 + */ + readonly subscription_id?: string; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: amount + * @description The amount that was paid for this subscription in the subscription's currency. + * @example 123.45 + */ + amount?: string; + /** + * Format: amount + * @description The amount that was paid for this subscription in the administration's primary currency. + * @example 123.45 + */ + pc_amount?: string; + /** + * Format: amount + * @description The foreign amount that was paid for this subscription in the subscription's currency. + * @example 123.45 + */ + foreign_amount?: string; + /** + * Format: amount + * @description The foreign amount that was paid for this subscription in the administration's primary currency. + * @example 123.45 + */ + pc_foreign_amount?: string; + }[]; + /** @description Array of future dates when the bill is expected to be paid. Autogenerated. */ + readonly pay_dates?: string[]; + /** + * Format: date-time + * @description When the subscription is expected to be due. + * @example 2026-10-01T00:00:00+00:00 + */ + readonly next_expected_match?: string | null; + /** + * Format: string + * @description Formatted (locally) when the subscription is due. + * @example today + */ + readonly next_expected_match_diff?: string | null; + }; + BillRead: { + /** + * Format: string + * @description Immutable value + * @example bills + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["BillProperties"]; + }; + BillSingle: { + data: components["schemas"]["BillRead"]; + }; + BillStore: { + /** + * Format: string + * @description Use either currency_id or currency_code + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description Use either currency_id or currency_code + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example Rent + */ + name: string; + /** + * Format: amount + * @example 123.45 + */ + amount_min: string; + /** + * Format: amount + * @example 123.45 + */ + amount_max: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + date: string; + /** + * Format: date-time + * @description The date after which this bill is no longer valid or applicable + * @example 2026-10-31T23:59:59+00:00 + */ + end_date?: string; + /** + * Format: date-time + * @description The date before which the bill must be renewed (or cancelled) + * @example 2026-10-31T23:59:59+00:00 + */ + extension_date?: string; + repeat_freq: components["schemas"]["BillRepeatFrequency"]; + /** + * Format: int32 + * @description How often the bill must be skipped. 1 means a bi-monthly bill. + * @example 0 + */ + skip?: number; + /** + * @description If the bill is active. + * @example true + */ + active?: boolean; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + }; + BillUpdate: { + /** + * Format: string + * @description Use either currency_id or currency_code + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description Use either currency_id or currency_code + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example Rent + */ + name: string; + /** + * Format: amount + * @example 123.45 + */ + amount_min?: string; + /** + * Format: amount + * @example 123.45 + */ + amount_max?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + date?: string; + /** + * Format: date-time + * @description The date after which this bill is no longer valid or applicable + * @example 2026-10-31T23:59:59+00:00 + */ + end_date?: string; + /** + * Format: date-time + * @description The date before which the bill must be renewed (or cancelled) + * @example 2026-10-31T23:59:59+00:00 + */ + extension_date?: string; + repeat_freq?: components["schemas"]["BillRepeatFrequency"]; + /** + * Format: int32 + * @description How often the bill must be skipped. 1 means a bi-monthly bill. + * @example 0 + */ + skip?: number; + /** + * @description If the bill is active. + * @example true + */ + active?: boolean; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + }; + BudgetProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** @example false */ + active?: boolean; + /** + * Format: string + * @example Bills + */ + name: string; + /** + * Format: int32 + * @example 5 + */ + readonly order?: number; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + auto_budget_type?: components["schemas"]["AutoBudgetType"]; + auto_budget_period?: components["schemas"]["AutoBudgetPeriod"]; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: int32 + * @description The order of the group. At least 1, for the highest sorting. + * @example 5 + */ + readonly object_group_order?: number | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + /** + * @description Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: amount + * @description The amount for the auto-budget, if set. + * @example -1012.12 + */ + auto_budget_amount?: string | null; + /** + * Format: amount + * @description The amount for the auto-budget, if set in the primary currency of the administration. + * @example -1012.12 + */ + pc_auto_budget_amount?: string | null; + /** @description Information on how much was spent in this budget. Is only filled in when the start and end date are submitted. */ + readonly spent?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description Information on how much was spent in this budget. Is only filled in when the start and end date are submitted. It is converted to the primary currency of the administration. */ + readonly pc_spent?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + }; + BudgetRead: { + /** + * Format: string + * @description Immutable value + * @example budgets + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["BudgetProperties"]; + }; + BudgetSingle: { + data: components["schemas"]["BudgetRead"]; + }; + BudgetStore: { + /** + * Format: string + * @example Bills + */ + name: string; + /** @example false */ + active?: boolean; + /** + * Format: int32 + * @example 5 + */ + readonly order?: number; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + /** + * @description Whether or not to fire the webhooks that are related to this event. + * @default true + * @example true + */ + fire_webhooks: boolean; + auto_budget_type?: components["schemas"]["AutoBudgetType"]; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's financial administration's currency. + * @example 12 + */ + auto_budget_currency_id?: string | null; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's financial administration's currency. + * @example EUR + */ + auto_budget_currency_code?: string | null; + /** + * Format: amount + * @example -1012.12 + */ + auto_budget_amount?: string | null; + auto_budget_period?: components["schemas"]["AutoBudgetPeriod"]; + }; + BudgetUpdate: { + /** + * Format: string + * @example Bills + */ + name: string; + /** @example false */ + active?: boolean; + /** + * Format: int32 + * @example 5 + */ + order?: number; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + /** + * @description Whether or not to fire the webhooks that are related to this event. + * @default true + * @example true + */ + fire_webhooks: boolean; + auto_budget_type?: components["schemas"]["AutoBudgetType"]; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's financial administration's currency. + * @example 12 + */ + auto_budget_currency_id?: string | null; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's financial administration's currency. + * @example EUR + */ + auto_budget_currency_code?: string | null; + /** + * Format: amount + * @example -1012.12 + */ + auto_budget_amount?: string | null; + auto_budget_period?: components["schemas"]["AutoBudgetPeriod"]; + }; + BudgetLimitProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: date-time + * @description Start date of the budget limit. + * @example 2026-10-01T00:00:00+00:00 + */ + start?: string; + /** + * Format: date-time + * @description End date of the budget limit. + * @example 2026-10-31T23:59:59+00:00 + */ + end?: string; + /** + * Format: string + * @description The budget ID of the associated budget. + * @example 23 + */ + readonly budget_id?: string; + /** + * @description Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: amount + * @example 123.45 + */ + amount?: string; + /** + * Format: amount + * @description The amount of this budget limit in the user's primary currency, if the original amount is in a different currency. + * @example 123.45 + */ + readonly pc_amount?: string | null; + /** + * Format: string + * @description Period of the budget limit. Only used when auto-generated by auto-budget. + * @example monthly + */ + readonly period?: string | null; + /** @description Amount(s) spent in the currencies in the database for this budget limit. */ + readonly spent?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description Amount(s) spent in the primary currency in the database for this budget limit. */ + readonly pc_spent?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** + * Format: string + * @description Some notes for this specific budget limit. + * @example Some example notes + */ + notes?: string | null; + }; + BudgetLimitRead: { + /** + * Format: string + * @description Immutable value + * @example budget_limits + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["BudgetLimitProperties"]; + }; + BudgetLimitSingle: { + data: components["schemas"]["BudgetLimitRead"]; + }; + BudgetLimitStore: { + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's primary currency. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description Use either currency_id or currency_code. Defaults to the user's primary currency. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @description The budget ID of the associated budget. + * @example 23 + */ + readonly budget_id: string; + /** + * Format: date + * @description Start date of the budget limit. + * @example 2026-10-01 + */ + start: string; + /** + * Format: string + * @description Period of the budget limit. Only used when auto-generated by auto-budget. + * @example monthly + */ + readonly period?: string | null; + /** + * Format: date + * @description End date of the budget limit. + * @example 2026-10-31 + */ + end: string; + /** + * Format: amount + * @example 123.45 + */ + amount: string; + /** + * Format: string + * @description Some notes for this specific budget limit. + * @example Some example notes + */ + notes?: string | null; + /** + * @description Whether or not to fire the webhooks that are related to this event. + * @default true + * @example true + */ + fire_webhooks: boolean; + }; + BudgetLimitUpdate: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: date-time + * @description Start date of the budget limit. + * @example 2026-10-01T00:00:00+00:00 + */ + start?: string; + /** + * Format: date-time + * @description End date of the budget limit. + * @example 2026-10-31T23:59:59+00:00 + */ + end?: string; + /** + * Format: string + * @description The budget ID of the associated budget. + * @example 23 + */ + readonly budget_id?: string; + /** + * @description Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: string + * @description Period of the budget limit. Only used when auto-generated by auto-budget. + * @example monthly + */ + readonly period?: string | null; + /** + * Format: amount + * @example 123.45 + */ + amount?: string; + /** + * Format: amount + * @description The amount of this budget limit in the user's primary currency, if the original amount is in a different currency. + * @example 123.45 + */ + readonly pc_amount?: string | null; + /** + * Format: amount + * @description Will be in the primary currency if this is turned on by the user. + * @example -1012.12 + */ + readonly spent?: string | null; + /** + * Format: string + * @description Some notes for this specific budget limit. + * @example Some example notes + */ + notes?: string | null; + /** + * @description Whether or not to fire the webhooks that are related to this event. + * @default true + * @example true + */ + fire_webhooks: boolean; + }; + CategoryProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @example Lunch + */ + name: string; + /** + * Format: string + * @description The color of the category in HEX format. Firefly III does not use this field, but your app might. + * @example FF0000 + */ + color?: string; + /** + * Format: date-time + * @description Last activity of the category. + * @example 2026-10-01T00:00:00+00:00 + */ + last_activity?: string | null; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * @description This object never has its own currency setting, so this value is always false. + * @example false + */ + object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** @description Amount(s) spent in the currencies in the database for this category. ONLY present when start and date are set. */ + readonly spent?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description Amount(s) spent in the primary currency in the database for this category. ONLY present when start and date are set. */ + readonly pc_spent?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description Amount(s) earned in the currencies in the database for this category. ONLY present when start and date are set. */ + readonly earned?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description Amount(s) earned in the primary currency in the database for this category. ONLY present when start and date are set. */ + readonly pc_earned?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description Amount(s) transferred in the currencies in the database for this category. ONLY present when start and date are set. */ + readonly transferred?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + /** @description Amount(s) transferred in primary currency in the database for this category. ONLY present when start and date are set. */ + readonly pc_transferred?: components["schemas"]["ArrayEntryWithCurrencyAndSum"][]; + }; + CategoryStore: { + /** + * Format: string + * @example Lunch + */ + name: string; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: string + * @description The color of the category in HEX format. Firefly III does not use this field, but your app might. + * @example FF0000 + */ + color?: string | null; + }; + CategoryUpdate: { + /** + * Format: string + * @example Lunch + */ + name: string; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: string + * @description The color of the category in HEX format. Firefly III does not use this field, but your app might. + * @example FF0000 + */ + color?: string | null; + }; + CurrencyExchangeProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @description Base currency ID for this exchange rate entry. + * @example 12 + */ + readonly from_currency_id?: string; + /** + * Format: string + * @description Base currency name for this exchange rate entry. + * @example Euro + */ + readonly from_currency_name?: string; + /** + * Format: string + * @description Base currency code for this exchange rate entry. + * @example EUR + */ + readonly from_currency_code?: string; + /** + * Format: string + * @description Base currency symbol for this exchange rate entry. + * @example $ + */ + readonly from_currency_symbol?: string; + /** + * Format: int32 + * @description Base currency decimal places for this exchange rate entry. + * @example 2 + */ + readonly from_currency_decimal_places?: number; + /** + * Format: string + * @description Destination currency ID for this exchange rate entry. + * @example 12 + */ + readonly to_currency_id?: string; + /** + * Format: string + * @description Destination currency name for this exchange rate entry. + * @example EUR + */ + readonly to_currency_name?: string; + /** + * Format: string + * @description Destination currency code for this exchange rate entry. + * @example EUR + */ + readonly to_currency_code?: string; + /** + * Format: string + * @description Destination currency symbol for this exchange rate entry. + * @example $ + */ + readonly to_currency_symbol?: string; + /** + * Format: int32 + * @description Destination currency decimal places for this exchange rate entry. + * @example 2 + */ + readonly to_currency_decimal_places?: number; + /** + * Format: string + * @description The actual exchange rate. How many 'to' currency will you get for 1 'from' currency? + * @example 1.10340 + */ + readonly rate?: string; + /** + * Format: date-time + * @description Date and time of the exchange rate. + * @example 2026-10-01T00:00:00+00:00 + */ + readonly date?: string; + }; + CurrencyExchangeRateRead: { + /** + * Format: string + * @description Immutable value + * @example currency_exchange_rates + */ + readonly type?: string; + /** + * Format: string + * @example 2 + */ + readonly id?: string; + attributes?: components["schemas"]["CurrencyExchangeProperties"]; + links?: components["schemas"]["ObjectLink"]; + }; + CurrencyExchangeRateSingle: { + data: components["schemas"]["CurrencyExchangeRateRead"]; + }; + CurrencyExchangeRateStore: { + /** + * Format: date + * @description The date to which the exchange rate is applicable. + * @example 2026-10-01 + */ + date: string; + /** + * Format: string + * @description The base currency code. + * @example USD + */ + from: string; + /** + * Format: string + * @description The destination currency code. + * @example EUR + */ + to: string; + /** + * Format: string + * @description The exchange rate from the base currency to the destination currency. + * @example 2.3456 + */ + rate?: string; + }; + CurrencyExchangeRateStoreByDate: { + /** + * Format: string + * @description The 'from'-currency + * @example EUR + */ + from: string; + /** + * @description The actual entries for this data set. They 'key' value is 'to' currency. The value is the exchange rate. + * @example { + * "USD": "1.2345", + * "GBP": "6.3456" + * } + */ + rates: { + [key: string]: string; + }; + }; + /** + * @description The actual entries for this data set. They 'key' value is the date in YYYY-MM-DD. The value is the exchange rate. + * @example { + * "2025-08-01": "1.2345", + * "2025-08-02": "6.3456" + * } + */ + CurrencyExchangeRateStoreByPair: { + [key: string]: string; + }; + CurrencyExchangeRateUpdate: { + /** + * Format: date + * @description The date to which the exchange rate is applicable. + * @example 2026-10-01 + */ + date: string; + /** + * Format: string + * @description The exchange rate from the base currency to the destination currency. + * @example 2.3456 + */ + rate: string; + /** + * Format: string + * @description The base currency code. + * @example USD + */ + from?: string | null; + /** + * Format: string + * @description The destination currency code. + * @example EUR + */ + to?: string | null; + }; + CurrencyExchangeRateUpdateNoDate: { + /** + * Format: string + * @description The exchange rate from the base currency to the destination currency. + * @example 2.3456 + */ + rate: string; + }; + ObjectGroup: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @example My object group + */ + title: string; + /** + * Format: int32 + * @description Order of the object group + * @example 1 + */ + order: number; + }; + ObjectGroupUpdate: { + /** + * Format: string + * @example My object group + */ + title: string; + /** + * Format: int32 + * @description Order of the object group + * @example 1 + */ + order?: number; + }; + ObjectLink: { + 0?: { + /** + * Format: string + * @example self + */ + rel?: string; + /** + * Format: string + * @example /OBJECTS/1 + */ + uri?: string; + }; + /** + * Format: uri + * @example https://demo.firefly-iii.org/api/v1/OBJECTS/1 + */ + self?: string; + }; + PageLink: { + /** + * Format: uri + * @example https://demo.firefly-iii.org/api/v1/OBJECT?&page=4 + */ + self?: string; + /** + * Format: uri + * @example https://demo.firefly-iii.org/api/v1/OBJECT?&page=1 + */ + first?: string; + /** + * Format: uri + * @example https://demo.firefly-iii.org/api/v1/OBJECT?&page=3 + */ + next?: string | null; + /** + * Format: uri + * @example https://demo.firefly-iii.org/api/v1/OBJECT?&page=2 + */ + prev?: string | null; + /** + * Format: uri + * @example https://demo.firefly-iii.org/api/v1/OBJECT?&page=12 + */ + last?: string; + }; + PiggyBankAccountRead: { + /** + * Format: string + * @description The ID of the account. + * @example 3 + */ + readonly account_id?: string; + /** + * Format: string + * @example Checking account + */ + readonly name?: string; + /** + * Format: amount + * @example 123.45 + */ + current_amount?: string; + /** + * Format: amount + * @description If convertToPrimary is on, this will show the amount in the primary currency. + * @example 123.45 + */ + pc_current_amount?: string; + }; + PiggyBankAccountStore: { + /** + * Format: string + * @description The ID of the account. + * @example 3 + */ + id: string | null; + /** + * Format: string + * @description The name of the account. + * @example Checking account + */ + name?: string | null; + /** + * Format: amount + * @description The amount saved currently. + * @example 123.45 + */ + current_amount?: string; + }; + PiggyBankAccountUpdate: { + /** + * Format: string + * @description The ID of the account. + * @example 3 + */ + account_id?: string | null; + /** + * Format: string + * @description The name of the account. + * @example Checking account + */ + name?: string | null; + /** + * Format: amount + * @description The amount saved currently. + * @example 123.45 + */ + current_amount?: string | null; + }; + PiggyBankProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @example New digital camera + */ + name: string; + /** + * Format: int32 + * @description The percentage of the target amount that has been saved, if a target amount is set. + * @example 12 + */ + readonly percentage?: number | null; + /** + * Format: date-time + * @description The date you started with this piggy bank. + * @example 2026-10-01T00:00:00+00:00 + */ + start_date?: string; + /** + * Format: date-time + * @description The date you intend to finish saving money. + * @example 2026-10-01T00:00:00+00:00 + */ + target_date?: string | null; + /** + * Format: int32 + * @example 5 + */ + order?: number; + /** @example true */ + readonly active?: boolean; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: int32 + * @description The order of the group. At least 1, for the highest sorting. + * @example 5 + */ + readonly object_group_order?: number | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + accounts?: components["schemas"]["PiggyBankAccountRead"][]; + /** + * @description Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: amount + * @example 123.45 + */ + target_amount: string | null; + /** + * Format: amount + * @description The target amount in the primary currency of the administration. + * @example 123.45 + */ + pc_target_amount?: string | null; + /** + * Format: amount + * @example 123.45 + */ + current_amount?: string; + /** + * Format: amount + * @description The current amount in the primary currency of the administration. + * @example 123.45 + */ + pc_current_amount?: string; + /** + * Format: string + * @example 700.00 + */ + left_to_save?: string | null; + /** + * Format: string + * @example 700.00 + */ + pc_left_to_save?: string | null; + /** + * Format: string + * @example 12.45 + */ + readonly save_per_month?: string | null; + /** + * Format: string + * @example 12.45 + */ + readonly pc_save_per_month?: string | null; + }; + PiggyBankStore: { + /** + * Format: string + * @example New digital camera + */ + name: string; + accounts?: components["schemas"]["PiggyBankAccountStore"][]; + /** + * Format: amount + * @example 123.45 + */ + target_amount: string | null; + /** + * Format: amount + * @example 123.45 + */ + current_amount?: string; + /** + * Format: date + * @description The date you started with this piggy bank. + * @example 2026-10-01 + */ + start_date: string; + /** + * Format: date + * @description The date you intend to finish saving money. + * @example 2026-10-31 + */ + target_date?: string | null; + /** + * Format: int32 + * @example 5 + */ + order?: number; + /** @example true */ + readonly active?: boolean; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + }; + PiggyBankUpdate: { + /** + * Format: string + * @example New digital camera + */ + name?: string; + accounts?: components["schemas"]["PiggyBankAccountUpdate"][]; + /** + * Format: string + * @example 5 + */ + readonly currency_id?: string; + /** + * Format: string + * @example USD + */ + readonly currency_code?: string; + /** + * Format: amount + * @example 123.45 + */ + target_amount?: string | null; + /** + * Format: date + * @description The date you started with this piggy bank. + * @example 2026-10-01 + */ + start_date?: string; + /** + * Format: date + * @description The date you intend to finish saving money. + * @example 2026-10-31 + */ + target_date?: string | null; + /** + * Format: int32 + * @example 5 + */ + order?: number; + /** @example true */ + readonly active?: boolean; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + /** + * Format: string + * @description The group ID of the group this object is part of. NULL if no group. + * @example 5 + */ + object_group_id?: string | null; + /** + * Format: string + * @description The name of the group. NULL if no group. + * @example Example Group + */ + object_group_title?: string | null; + }; + PiggyBankEventProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + updated_at?: string; + /** + * Format: amount + * @example 123.45 + */ + amount?: string; + /** + * Format: amount + * @example 123.45 + */ + pc_amount?: string; + /** + * @description Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: string + * @description The journal associated with the event. + * @example 4291 + */ + transaction_journal_id?: string | null; + /** + * Format: string + * @description The transaction group associated with the event. + * @example 4291 + */ + transaction_group_id?: string | null; + }; + Preference: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @example currencyPreference + */ + name: string; + data: components["schemas"]["PolymorphicProperty"]; + }; + PreferenceUpdate: { + data: components["schemas"]["PolymorphicProperty"]; + }; + RecurrenceProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + type?: components["schemas"]["RecurrenceTransactionType"]; + /** + * Format: string + * @example Rent + */ + title?: string; + /** + * Format: string + * @description Not to be confused with the description of the actual transaction(s) being created. + * @example Recurring transaction for the monthly rent + */ + description?: string; + /** + * Format: date + * @description First time the recurring transaction will fire. Must be after today. + * @example 2026-10-31 + */ + first_date?: string; + /** + * Format: date + * @description Last time the recurring transaction has fired. + * @example 2026-10-01 + */ + readonly latest_date?: string | null; + /** + * Format: date + * @description Date until the recurring transaction can fire. Use either this field or repetitions. + * @example 2026-10-31 + */ + repeat_until?: string | null; + /** + * @description Whether or not to fire the rules after the creation of a transaction. + * @example true + */ + apply_rules?: boolean; + /** + * @description If the recurrence is even active. + * @example true + */ + active?: boolean; + /** + * Format: int32 + * @description Max number of created transactions. Use either this field or repeat_until. + * @example 5 + */ + nr_of_repetitions?: number | null; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + repetitions?: components["schemas"]["RecurrenceRepetition"][]; + transactions?: components["schemas"]["RecurrenceTransaction"][]; + }; + RecurrenceStore: { + type: components["schemas"]["RecurrenceTransactionType"]; + /** + * Format: string + * @example Rent + */ + title: string; + /** + * Format: string + * @description Not to be confused with the description of the actual transaction(s) being created. + * @example Recurring transaction for the monthly rent + */ + description?: string; + /** + * Format: date + * @description First time the recurring transaction will fire. Must be after today. + * @example 2026-10-31 + */ + first_date: string; + /** + * Format: date + * @description Date until the recurring transaction can fire. Use either this field or repetitions. + * @example 2026-10-31 + */ + repeat_until: string | null; + /** + * Format: int32 + * @description Max number of created transactions. Use either this field or repeat_until. + * @example 5 + */ + nr_of_repetitions?: number | null; + /** + * @description Whether or not to fire the rules after the creation of a transaction. + * @example true + */ + apply_rules?: boolean; + /** + * @description If the recurrence is even active. + * @example true + */ + active?: boolean; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + repetitions: components["schemas"]["RecurrenceRepetitionStore"][]; + transactions: components["schemas"]["RecurrenceTransactionStore"][]; + }; + RecurrenceUpdate: { + /** + * Format: string + * @example Rent + */ + title?: string; + /** + * Format: string + * @description Not to be confused with the description of the actual transaction(s) being created. + * @example Recurring transaction for the monthly rent + */ + description?: string; + /** + * Format: date + * @description First time the recurring transaction will fire. + * @example 2026-10-31 + */ + first_date?: string; + /** + * Format: date + * @description Date until when the recurring transaction can fire. After that date, it's basically inactive. Use either this field or repetitions. + * @example 2026-10-31 + */ + repeat_until?: string | null; + /** + * Format: int32 + * @description Max number of created transactions. Use either this field or repeat_until. + * @example 5 + */ + nr_of_repetitions?: number | null; + /** + * @description Whether or not to fire the rules after the creation of a transaction. + * @example true + */ + apply_rules?: boolean; + /** + * @description If the recurrence is even active. + * @example true + */ + active?: boolean; + /** + * Format: string + * @example Some notes + */ + notes?: string | null; + repetitions?: components["schemas"]["RecurrenceRepetitionUpdate"][]; + transactions?: components["schemas"]["RecurrenceTransactionUpdate"][]; + }; + RecurrenceRepetition: { + /** + * Format: string + * @example 2 + */ + readonly id?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + type: components["schemas"]["RecurrenceRepetitionType"]; + /** + * Format: string + * @description Information that defined the type of repetition. + * - For 'daily', this is empty. + * - For 'weekly', it is day of the week between 1 and 7 (Monday - Sunday). + * - For 'ndom', it is '1,2' or '4,5' or something else, where the first number is the week in the month, and the second number is the day in the week (between 1 and 7). '2,3' means: the 2nd Wednesday of the month + * - For 'monthly' it is the day of the month (1 - 31) + * - For yearly, it is a full date, ie '2026-10-01'. The year you use does not matter. + * @example 3 + */ + moment: string; + /** + * Format: int32 + * @description How many occurrences to skip. 0 means skip nothing. 1 means every other. + * @example 0 + */ + skip?: number; + /** + * Format: int32 + * @description How to respond when the recurring transaction falls in the weekend. Possible values: + * 1. Do nothing, just create it + * 2. Create no transaction. + * 3. Skip to the previous Friday. + * 4. Skip to the next Monday. + * @example 1 + */ + weekend?: number; + /** + * Format: string + * @description Auto-generated repetition description. + * @example Every week on Friday + */ + readonly description?: string; + /** @description Array of future dates when the repetition will apply to. Auto generated. */ + readonly occurrences?: string[]; + }; + RecurrenceRepetitionStore: { + type: components["schemas"]["RecurrenceRepetitionType"]; + /** + * Format: string + * @description Information that defined the type of repetition. + * - For 'daily', this is empty. + * - For 'weekly', it is day of the week between 1 and 7 (Monday - Sunday). + * - For 'ndom', it is '1,2' or '4,5' or something else, where the first number is the week in the month, and the second number is the day in the week (between 1 and 7). '2,3' means: the 2nd Wednesday of the month + * - For 'monthly' it is the day of the month (1 - 31) + * - For yearly, it is a full date, ie '2026-10-01'. The year you use does not matter. + * @example 3 + */ + moment: string; + /** + * Format: int32 + * @description How many occurrences to skip. 0 means skip nothing. 1 means every other. + * @example 0 + */ + skip?: number; + /** + * Format: int32 + * @description How to respond when the recurring transaction falls in the weekend. Possible values: + * 1. Do nothing, just create it + * 2. Create no transaction. + * 3. Skip to the previous Friday. + * 4. Skip to the next Monday. + * @example 1 + */ + weekend?: number; + }; + RecurrenceRepetitionUpdate: { + type?: components["schemas"]["RecurrenceRepetitionType"]; + /** + * Format: string + * @description Information that defined the type of repetition. + * - For 'daily', this is empty. + * - For 'weekly', it is day of the week between 1 and 7 (Monday - Sunday). + * - For 'ndom', it is '1,2' or '4,5' or something else, where the first number is the week in the month, and the second number is the day in the week (between 1 and 7). '2,3' means: the 2nd Wednesday of the month + * - For 'monthly' it is the day of the month (1 - 31) + * - For yearly, it is a full date, ie '2026-10-01'. The year you use does not matter. + * @example 3 + */ + moment?: string; + /** + * Format: int32 + * @description How many occurrences to skip. 0 means skip nothing. 1 means every other. + * @example 0 + */ + skip?: number; + /** + * Format: int32 + * @description How to respond when the recurring transaction falls in the weekend. Possible values: + * 1. Do nothing, just create it + * 2. Create no transaction. + * 3. Skip to the previous Friday. + * 4. Skip to the next Monday. + * @example 1 + */ + weekend?: number; + }; + RecurrenceTransaction: { + /** + * Format: string + * @example ID of the recurring transaction. Not to be confused with the ID of the recurrence itself. + */ + id?: string; + /** + * Format: string + * @example Rent for the current month + */ + description: string; + /** + * @description Indicates whether the object has a currency setting. If false, the object uses the administration's primary currency. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description The currency ID of the currency associated with this object. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @description The currency name of the currency associated with this object. + * @example Euro + */ + currency_name?: string; + /** + * Format: string + * @description The currency code of the currency associated with this object. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: int32 + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: string + * @description The currency ID of the administration's primary currency. + * @example 5 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description The currency name of the administration's primary currency. + * @example Euro + */ + readonly primary_currency_name?: string; + /** + * Format: string + * @description The currency code of the administration's primary currency. + * @example EUR + */ + readonly primary_currency_code?: string; + /** + * Format: string + * @description The currency symbol of the administration's primary currency. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description The currency decimal places of the administration's primary currency. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + /** + * Format: amount + * @description Amount of the transaction. + * @example 123.45 + */ + amount: string; + /** + * Format: amount + * @description Amount of the transaction in primary currency. + * @example 123.45 + */ + pc_amount?: string; + /** + * Format: amount + * @description Foreign amount of the transaction. + * @example 123.45 + */ + foreign_amount?: string | null; + /** + * Format: amount + * @description Foreign amount of the transaction. + * @example 123.45 + */ + pc_foreign_amount?: string | null; + /** + * Format: string + * @example 17 + */ + foreign_currency_id?: string | null; + /** + * Format: string + * @example British Pound + */ + foreign_currency_name?: string | null; + /** + * Format: string + * @example GBP + */ + foreign_currency_code?: string | null; + /** + * Format: string + * @example $ + */ + readonly foreign_currency_symbol?: string | null; + /** + * Format: int32 + * @description Number of decimals in the currency + * @example 2 + */ + readonly foreign_currency_decimal_places?: number | null; + /** + * Format: string + * @description The budget ID for this transaction. + * @example 4 + */ + budget_id?: string; + /** + * Format: string + * @description The name of the budget to be used. If the budget name is unknown, the ID will be used or the value will be ignored. + * @example Groceries + */ + readonly budget_name?: string | null; + /** + * Format: string + * @description Category ID for this transaction. + * @example 211 + */ + category_id?: string; + /** + * Format: string + * @description Category name for this transaction. + * @example Bills + */ + category_name?: string; + /** + * Format: string + * @description ID of the source account. Submit either this or source_name. + * @example 913 + */ + source_id?: string; + /** + * Format: string + * @description Name of the source account. Submit either this or source_id. + * @example Checking account + */ + source_name?: string; + /** + * Format: string + * @example NL02ABNA0123456789 + */ + readonly source_iban?: string | null; + source_type?: components["schemas"]["AccountTypeProperty"]; + /** + * Format: string + * @description ID of the destination account. Submit either this or destination_name. + * @example 258 + */ + destination_id?: string; + /** + * Format: string + * @description Name of the destination account. Submit either this or destination_id. + * @example Buy and Large + */ + destination_name?: string; + /** + * Format: string + * @example NL02ABNA0123456789 + */ + readonly destination_iban?: string | null; + destination_type?: components["schemas"]["AccountTypeProperty"]; + /** + * @description Array of tags. + * @example null + */ + tags?: string[] | null; + /** + * Format: string + * @example 123 + */ + piggy_bank_id?: string | null; + /** Format: string */ + piggy_bank_name?: string | null; + /** + * Format: string + * @example 123 + */ + subscription_id?: string | null; + /** Format: string */ + subscription_name?: string | null; + }; + RecurrenceTransactionStore: { + /** + * Format: string + * @example Rent for the current month + */ + description: string; + /** + * Format: amount + * @description Amount of the transaction. + * @example 123.45 + */ + amount: string; + /** + * Format: amount + * @description Foreign amount of the transaction. + * @example 123.45 + */ + foreign_amount?: string | null; + /** + * Format: string + * @description Submit either a currency_id or a currency_code. + * @example 3 + */ + currency_id?: string; + /** + * Format: string + * @description Submit either a currency_id or a currency_code. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @description Submit either a foreign_currency_id or a foreign_currency_code, or neither. + * @example 17 + */ + foreign_currency_id?: string | null; + /** + * Format: string + * @description Submit either a foreign_currency_id or a foreign_currency_code, or neither. + * @example GBP + */ + foreign_currency_code?: string | null; + /** + * Format: string + * @description The budget ID for this transaction. + * @example 4 + */ + budget_id?: string; + /** + * Format: string + * @description Category ID for this transaction. + * @example 211 + */ + category_id?: string; + /** + * Format: string + * @description ID of the source account. + * @example 913 + */ + source_id: string; + /** + * Format: string + * @description ID of the destination account. + * @example 258 + */ + destination_id: string; + /** + * @description Array of tags. + * @example null + */ + tags?: string[] | null; + /** + * Format: string + * @description Optional. + * @example 123 + */ + piggy_bank_id?: string | null; + /** + * Format: string + * @description Optional. + * @example 123 + */ + bill_id?: string | null; + }; + RecurrenceTransactionUpdate: { + /** + * Format: string + * @example ID of the recurring transaction. Not to be confused with the ID of the recurrence itself. Is marked as REQUIRED but can be skipped when there is only ONE transaction. + */ + id: string; + /** + * Format: string + * @example Rent for the current month + */ + description?: string; + /** + * Format: amount + * @description Amount of the transaction. + * @example 123.45 + */ + amount?: string; + /** + * Format: amount + * @description Foreign amount of the transaction. + * @example 123.45 + */ + foreign_amount?: string | null; + /** + * Format: string + * @description Submit either a currency_id or a currency_code. + * @example 3 + */ + currency_id?: string; + /** + * Format: string + * @description Submit either a currency_id or a currency_code. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @description Submit either a foreign_currency_id or a foreign_currency_code, or neither. + * @example 17 + */ + foreign_currency_id?: string | null; + /** + * Format: string + * @description The budget ID for this transaction. + * @example 4 + */ + budget_id?: string; + /** + * Format: string + * @description Category ID for this transaction. + * @example 211 + */ + category_id?: string; + /** + * Format: string + * @description ID of the source account. Submit either this or source_name. + * @example 913 + */ + source_id?: string; + /** + * Format: string + * @description ID of the destination account. Submit either this or destination_name. + * @example 258 + */ + destination_id?: string; + /** + * @description Array of tags. + * @example null + */ + tags?: string[] | null; + /** + * Format: string + * @example 123 + */ + piggy_bank_id?: string | null; + /** + * Format: string + * @description Optional. + * @example 123 + */ + bill_id?: string | null; + }; + Rule: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @example First rule title. + */ + title: string; + /** + * Format: string + * @example First rule description + */ + description?: string; + /** + * Format: string + * @description ID of the rule group under which the rule must be stored. Either this field or rule_group_title is mandatory. + * @example 81 + */ + rule_group_id: string; + /** + * Format: string + * @description Title of the rule group under which the rule must be stored. Either this field or rule_group_id is mandatory. + * @example New rule group + */ + rule_group_title?: string; + /** + * Format: int32 + * @example 5 + */ + readonly order?: number; + trigger: components["schemas"]["RuleTriggerType"]; + /** + * @description Whether or not the rule is even active. Default is true. + * @default true + * @example true + */ + active: boolean; + /** + * @description If the rule is set to be strict, ALL triggers must hit in order for the rule to fire. Otherwise, just one is enough. Default value is true. + * @example true + */ + strict?: boolean; + /** + * @description If this value is true and the rule is triggered, other rules after this one in the group will be skipped. Default value is false. + * @default false + * @example false + */ + stop_processing: boolean; + triggers: components["schemas"]["RuleTrigger"][]; + actions: components["schemas"]["RuleAction"][]; + }; + RuleStore: { + /** + * Format: string + * @example First rule title. + */ + title: string; + /** + * Format: string + * @example First rule description + */ + description?: string; + /** + * Format: string + * @description ID of the rule group under which the rule must be stored. Either this field or rule_group_title is mandatory. + * @example 81 + */ + rule_group_id: string; + /** + * Format: string + * @description Title of the rule group under which the rule must be stored. Either this field or rule_group_id is mandatory. + * @example New rule group + */ + rule_group_title?: string; + /** + * Format: int32 + * @example 5 + */ + order?: number; + trigger: components["schemas"]["RuleTriggerType"]; + /** + * @description Whether or not the rule is even active. Default is true. + * @default true + * @example true + */ + active: boolean; + /** + * @description If the rule is set to be strict, ALL triggers must hit in order for the rule to fire. Otherwise, just one is enough. Default value is true. + * @default true + * @example true + */ + strict: boolean; + /** + * @description If this value is true and the rule is triggered, other rules after this one in the group will be skipped. Default value is false. + * @example false + */ + stop_processing?: boolean; + triggers: components["schemas"]["RuleTriggerStore"][]; + actions: components["schemas"]["RuleActionStore"][]; + }; + RuleUpdate: { + /** + * Format: string + * @example First rule title. + */ + title?: string; + /** + * Format: string + * @example First rule description + */ + description?: string; + /** + * Format: string + * @description ID of the rule group under which the rule must be stored. Either this field or rule_group_title is mandatory. + * @example 81 + */ + rule_group_id?: string; + /** + * Format: int32 + * @example 5 + */ + order?: number; + trigger?: components["schemas"]["RuleTriggerType"]; + /** + * @description Whether or not the rule is even active. Default is true. + * @default true + * @example true + */ + active: boolean; + /** + * @description If the rule is set to be strict, ALL triggers must hit in order for the rule to fire. Otherwise, just one is enough. Default value is true. + * @example true + */ + strict?: boolean; + /** + * @description If this value is true and the rule is triggered, other rules after this one in the group will be skipped. Default value is false. + * @default false + * @example false + */ + stop_processing: boolean; + triggers?: components["schemas"]["RuleTriggerUpdate"][]; + actions?: components["schemas"]["RuleActionUpdate"][]; + }; + RuleAction: { + /** + * Format: string + * @example 2 + */ + readonly id?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + type: components["schemas"]["RuleActionKeyword"]; + /** + * Format: string + * @description The accompanying value the action will set, change or update. Can be empty, but for some types this value is mandatory. + * @example Daily groceries + */ + value: string | null; + /** + * Format: int32 + * @description Order of the action + * @example 5 + */ + order?: number; + /** + * @description If the action is active. Defaults to true. + * @default true + * @example true + */ + active: boolean; + /** + * @description When true, other actions will not be fired after this action has fired. Defaults to false. + * @default false + * @example false + */ + stop_processing: boolean; + }; + RuleActionStore: { + type: components["schemas"]["RuleActionKeyword"]; + /** + * Format: string + * @description The accompanying value the action will set, change or update. Can be empty, but for some types this value is mandatory. + * @example Daily groceries + */ + value: string | null; + /** + * Format: int32 + * @description Order of the action + * @example 5 + */ + order?: number; + /** + * @description If the action is active. Defaults to true. + * @default true + * @example true + */ + active: boolean; + /** + * @description When true, other actions will not be fired after this action has fired. Defaults to false. + * @default false + * @example false + */ + stop_processing: boolean; + }; + RuleActionUpdate: { + type?: components["schemas"]["RuleActionKeyword"]; + /** + * Format: string + * @description The accompanying value the action will set, change or update. Can be empty, but for some types this value is mandatory. + * @example Daily groceries + */ + value?: string | null; + /** + * Format: int32 + * @description Order of the action + * @example 5 + */ + order?: number; + /** + * @description If the action is active. + * @example true + */ + active?: boolean; + /** + * @description When true, other actions will not be fired after this action has fired. + * @example false + */ + stop_processing?: boolean; + }; + RuleGroup: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @example Default rule group + */ + title: string; + /** + * Format: string + * @example Description of this rule group + */ + description?: string | null; + /** + * Format: int32 + * @example 4 + */ + readonly order?: number; + /** @example true */ + active?: boolean; + }; + RuleGroupStore: { + /** + * Format: string + * @example Default rule group + */ + title: string; + /** + * Format: string + * @example Description of this rule group + */ + description?: string | null; + /** + * Format: int32 + * @example 4 + */ + order?: number; + /** @example true */ + active?: boolean; + }; + RuleGroupUpdate: { + /** + * Format: string + * @example Default rule group + */ + title?: string; + /** + * Format: string + * @example Description of this rule group + */ + description?: string | null; + /** + * Format: int32 + * @example 4 + */ + order?: number; + /** @example true */ + active?: boolean; + }; + RuleTrigger: { + /** + * Format: string + * @example 2 + */ + readonly id?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + type: components["schemas"]["RuleTriggerKeyword"]; + /** + * Format: string + * @description The accompanying value the trigger responds to. This value is often mandatory, but this depends on the trigger. + * @example tag1 + */ + value: string; + /** + * @description If 'prohibited' is true, this rule trigger will be negated. 'Description is' will become 'Description is NOT' etc. + * @default false + * @example false + */ + prohibited: boolean; + /** + * Format: int32 + * @description Order of the trigger + * @example 5 + */ + readonly order?: number; + /** + * @description If the trigger is active. Defaults to true. + * @default true + * @example true + */ + active: boolean; + /** + * @description When true, other triggers will not be checked if this trigger was triggered. Defaults to false. + * @default false + * @example false + */ + stop_processing: boolean; + }; + RuleTriggerStore: { + type: components["schemas"]["RuleTriggerKeyword"]; + /** + * Format: string + * @description The accompanying value the trigger responds to. This value is often mandatory, but this depends on the trigger. + * @example tag1 + */ + value: string; + /** + * Format: int32 + * @description Order of the trigger + * @example 5 + */ + order?: number; + /** + * @description If the trigger is active. Defaults to true. + * @default true + * @example true + */ + active: boolean; + /** + * @description If 'prohibited' is true, this rule trigger will be negated. 'Description is' will become 'Description is NOT' etc. + * @default false + * @example false + */ + prohibited: boolean; + /** + * @description When true, other triggers will not be checked if this trigger was triggered. Defaults to false. + * @default false + * @example false + */ + stop_processing: boolean; + }; + RuleTriggerUpdate: { + type?: components["schemas"]["RuleTriggerKeyword"]; + /** + * Format: string + * @description The accompanying value the trigger responds to. This value is often mandatory, but this depends on the trigger. If the rule trigger is something like 'has any tag', submit the string 'true'. + * @example tag1 + */ + value?: string; + /** + * Format: int32 + * @description Order of the trigger + * @example 5 + */ + order?: number; + /** + * @description If the trigger is active. + * @example true + */ + active?: boolean; + /** + * @description When true, other triggers will not be checked if this trigger was triggered. + * @example false + */ + stop_processing?: boolean; + }; + /** A single tag (C) */ + TagModel: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @description The tag + * @example expensive + */ + tag: string; + /** + * Format: date + * @description The date to which the tag is applicable. + * @example 2026-10-01 + */ + date?: string | null; + /** + * Format: string + * @example Tag for expensive stuff + */ + description?: string | null; + /** + * Format: double + * @description Latitude of the tag's location, if applicable. Can be used to draw a map. + * @example 51.983333 + */ + latitude?: number | null; + /** + * Format: double + * @description Latitude of the tag's location, if applicable. Can be used to draw a map. + * @example 5.916667 + */ + longitude?: number | null; + /** + * Format: int32 + * @description Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels. + * @example 6 + */ + zoom_level?: number | null; + }; + /** A single tag (A) */ + TagModelStore: { + /** + * Format: string + * @description The tag + * @example expensive + */ + tag: string; + /** + * Format: date + * @description The date to which the tag is applicable. + * @example 2026-10-01 + */ + date?: string | null; + /** + * Format: string + * @example Tag for expensive stuff + */ + description?: string | null; + /** + * Format: double + * @description Latitude of the tag's location, if applicable. Can be used to draw a map. + * @example 51.983333 + */ + latitude?: number | null; + /** + * Format: double + * @description Latitude of the tag's location, if applicable. Can be used to draw a map. + * @example 5.916667 + */ + longitude?: number | null; + /** + * Format: int32 + * @description Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels. + * @example 6 + */ + zoom_level?: number | null; + }; + /** A single tag (B) */ + TagModelUpdate: { + /** + * Format: string + * @description The tag + * @example expensive + */ + tag?: string; + /** + * Format: date + * @description The date to which the tag is applicable. + * @example 2026-10-01 + */ + date?: string | null; + /** + * Format: string + * @example Tag for expensive stuff + */ + description?: string | null; + /** + * Format: double + * @description Latitude of the tag's location, if applicable. Can be used to draw a map. + * @example 51.983333 + */ + latitude?: number | null; + /** + * Format: double + * @description Latitude of the tag's location, if applicable. Can be used to draw a map. + * @example 5.916667 + */ + longitude?: number | null; + /** + * Format: int32 + * @description Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels. + * @example 6 + */ + zoom_level?: number | null; + }; + CurrencyProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * @description Defaults to true + * @default true + * @example true + */ + enabled: boolean; + /** + * @description Is the primary currency? + * @example false + */ + primary?: boolean; + /** + * Format: string + * @example AMS + */ + code: string; + /** + * Format: string + * @example Ankh-Morpork dollar + */ + name: string; + /** + * Format: string + * @example AM$ + */ + symbol: string; + /** + * Format: int32 + * @description Supports 0-16 decimals. + * @example 2 + */ + decimal_places?: number; + }; + CurrencyStore: { + /** + * @description Defaults to true + * @default true + * @example true + */ + enabled: boolean; + /** + * @description Make this currency the primary currency for the current administration. You can set this value to FALSE, in which case nothing will change to the primary currency. If you set it to TRUE, the current primary currency will no longer be the primary currency. + * @example true + */ + primary?: boolean; + /** + * Format: string + * @example AMS + */ + code: string; + /** + * Format: string + * @example Ankh-Morpork dollar + */ + name: string; + /** + * Format: string + * @example AM$ + */ + symbol: string; + /** + * Format: int32 + * @description Supports 0-16 decimals. + * @example 2 + */ + decimal_places?: number; + }; + CurrencyUpdate: { + /** + * @description If the currency is enabled + * @example true + */ + enabled?: boolean; + /** + * @description If the currency must be the primary for the user. You can only submit TRUE. Submitting FALSE will not drop this currency as the primary currency, because then the system would be without one. + * @example true + * @enum {boolean} + */ + primary?: true; + /** + * Format: string + * @description The currency code + * @example AMS + */ + code?: string; + /** + * Format: string + * @description The currency name + * @example Ankh-Morpork dollar + */ + name?: string; + /** + * Format: string + * @description The currency symbol + * @example AM$ + */ + symbol?: string; + /** + * Format: int32 + * @description How many decimals to use when displaying this currency. Between 0 and 16. + * @example 2 + */ + decimal_places?: number; + }; + Transaction: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @description User ID + * @example 3 + */ + readonly user?: string; + /** + * Format: string + * @description Title of the transaction if it has been split in more than one piece. Empty otherwise. + * @example Split transaction title. + */ + group_title?: string | null; + transactions: components["schemas"]["TransactionSplit"][]; + }; + TransactionStore: { + /** + * @description Break if the submitted transaction exists already. + * @example false + */ + error_if_duplicate_hash?: boolean; + /** + * @description Whether or not to apply rules when submitting transaction. + * @example false + */ + apply_rules?: boolean; + /** + * @description Whether or not to fire the webhooks that are related to this event. + * @default true + * @example true + */ + fire_webhooks: boolean; + /** + * Format: string + * @description Title of the transaction if it has been split in more than one piece. Empty otherwise. + * @example Split transaction title. + */ + group_title?: string | null; + transactions: components["schemas"]["TransactionSplitStore"][]; + }; + TransactionUpdate: { + /** + * @description Whether or not to apply rules when submitting transaction. + * @example false + */ + apply_rules?: boolean; + /** + * @description Whether or not to fire the webhooks that are related to this event. + * @default true + * @example true + */ + fire_webhooks: boolean; + /** + * Format: string + * @description Title of the transaction if it has been split in more than one piece. Empty otherwise. + * @example Split transaction title. + */ + group_title?: string | null; + transactions?: components["schemas"]["TransactionSplitUpdate"][]; + }; + TransactionLink: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @description The link type ID to use. You can also use the link_type_name field. + * @example 5 + */ + link_type_id: string; + /** + * Format: string + * @description The link type name to use. You can also use the link_type_id field. + * @example Is paid by + */ + link_type_name?: string; + /** + * Format: string + * @description The inward transaction transaction_journal_id for the link. This becomes the 'is paid by' transaction of the set. + * @example 131 + */ + inward_id: string; + /** + * Format: string + * @description The outward transaction transaction_journal_id for the link. This becomes the 'pays for' transaction of the set. + * @example 131 + */ + outward_id: string; + /** + * Format: string + * @description Optional. Some notes. + * @example Some example notes + */ + notes?: string | null; + }; + TransactionLinkStore: { + /** + * Format: string + * @description The link type ID to use. You can also use the link_type_name field. + * @example 5 + */ + link_type_id: string; + /** + * Format: string + * @description The link type name to use. You can also use the link_type_id field. + * @example Is paid by + */ + link_type_name?: string; + /** + * Format: string + * @description The inward transaction transaction_journal_id for the link. This becomes the 'is paid by' transaction of the set. + * @example 131 + */ + inward_id: string; + /** + * Format: string + * @description The outward transaction transaction_journal_id for the link. This becomes the 'pays for' transaction of the set. + * @example 131 + */ + outward_id: string; + /** + * Format: string + * @description Optional. Some notes. + * @example Some example notes + */ + notes?: string | null; + }; + TransactionLinkUpdate: { + /** + * Format: string + * @description The link type ID to use. Use this field OR use the link_type_name field. + * @example 5 + */ + link_type_id?: string; + /** + * Format: string + * @description The link type name to use. Use this field OR use the link_type_id field. + * @example Is paid by + */ + link_type_name?: string; + /** + * Format: string + * @description The inward transaction transaction_journal_id for the link. This becomes the 'is paid by' transaction of the set. + * @example 131 + */ + inward_id?: string; + /** + * Format: string + * @description The outward transaction transaction_journal_id for the link. This becomes the 'pays for' transaction of the set. + * @example 131 + */ + outward_id?: string; + /** + * Format: string + * @description Optional. Some notes. If you submit an empty string the current notes will be removed + * @example Some example notes + */ + notes?: string | null; + }; + LinkType: { + /** + * Format: string + * @example Paid + */ + name: string; + /** + * Format: string + * @example is (partially) paid for by + */ + inward: string; + /** + * Format: string + * @example (partially) pays for + */ + outward: string; + /** @example false */ + readonly editable?: boolean; + }; + LinkTypeUpdate: { + /** + * Format: string + * @example Paid + */ + name?: string; + /** + * Format: string + * @example is (partially) paid for by + */ + inward?: string; + /** + * Format: string + * @example (partially) pays for + */ + outward?: string; + }; + TransactionSplit: { + /** + * Format: string + * @description User ID + * @example 3 + */ + readonly user?: string; + /** + * Format: string + * @description ID of the underlying transaction journal. Each transaction consists of a transaction group (see the top ID) and one or more journals + * making up the splits of the transaction. + * @example 10421 + */ + readonly transaction_journal_id?: string; + type: components["schemas"]["TransactionTypeProperty"]; + /** + * Format: date-time + * @description Date of the transaction + * @example 2026-10-01T00:00:00+00:00 + */ + date: string; + /** + * Format: int32 + * @description Order of this entry in the list of transactions. + * @example 0 + */ + order?: number | null; + /** + * @description Indicates whether the transaction has a currency setting. For transactions this is always true. + * @example true + */ + readonly object_has_currency_setting?: boolean; + /** + * Format: string + * @description Currency ID for the currency of this transaction. + * @example 12 + */ + currency_id?: string; + /** + * Format: string + * @description Currency code for the currency of this transaction. + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @description Currency symbol for the currency of this transaction. + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: string + * @description Currency name for the currency of this transaction. + * @example Euro + */ + currency_name?: string; + /** + * Format: int32 + * @description Number of decimals used in this currency. + * @example 2 + */ + currency_decimal_places?: number; + /** + * Format: string + * @description Currency ID of the foreign currency, if this transaction has a foreign amount. + * @example 17 + */ + foreign_currency_id?: string | null; + /** + * Format: string + * @description Currency code of the foreign currency. Default is NULL. + * @example USD + */ + foreign_currency_code?: string | null; + /** + * Format: string + * @example $ + */ + readonly foreign_currency_symbol?: string | null; + /** + * Format: int32 + * @description Number of decimals in the foreign currency. + * @example 2 + */ + readonly foreign_currency_decimal_places?: number | null; + /** + * Format: string + * @description Returns the primary currency ID of the administration. This currency is used as the currency for all `pc_*` amount and balance fields of this account. + * @example 12 + */ + readonly primary_currency_id?: string | null; + /** + * Format: string + * @description Returns the primary currency code of the administration. This currency is used as the currency for all `pc_*` amount and balance fields of this account. + * @example EUR + */ + primary_currency_code?: string | null; + /** + * Format: string + * @description See the other `primary_*` fields. + * @example $ + */ + readonly primary_currency_symbol?: string | null; + /** + * Format: int32 + * @description See the other `primary_*` fields. + * @example 2 + */ + readonly primary_currency_decimal_places?: number | null; + /** + * Format: amount + * @description Amount of the transaction. + * @example 123.45 + */ + amount: string; + /** + * Format: amount + * @description Amount of the transaction in the primary currency of this administration. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings. + * @example 123.45 + */ + pc_amount?: string; + /** + * Format: amount + * @description The amount in the set foreign currency. May be NULL if the transaction does not have a foreign amount. + * @example 123.45 + */ + foreign_amount?: string | null; + /** + * Format: amount + * @description Foreign amount of the transaction in the primary currency of this administration. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings. + * @example 123.45 + */ + pc_foreign_amount?: string; + /** + * Format: amount + * @description The balance of the source account. This is the balance in the account's currency which may be different from this transaction, and is not provided in this model. + * @example 123.45 + */ + source_balance_after?: string | null; + /** + * Format: amount + * @description The balance of the source account in the primary currency of this administration. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings. + * @example 123.45 + */ + pc_source_balance_after?: string | null; + /** + * Format: amount + * @description The balance of the destination account. This is the balance in the account's currency which may be different from this transaction, and is not provided in this model. + * @example 123.45 + */ + destination_balance_after?: string | null; + /** + * Format: amount + * @description The balance of the destination account in the primary currency of this administration. The `primary_currency_*` fields reflect the currency used. This field is NULL if the user does have 'convert to primary' set to true in their settings. + * @example 123.45 + */ + pc_destination_balance_after?: string | null; + /** + * Format: string + * @description Description of the transaction. + * @example Vegetables + */ + description: string; + /** + * Format: string + * @description ID of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. + * @example 2 + */ + source_id: string | null; + /** + * Format: string + * @description Name of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. Can be used instead of the source_id. If the transaction is a deposit, the source_name can be filled in freely: the account will be created based on the name. + * @example Checking account + */ + source_name?: string | null; + /** + * Format: string + * @example NL02ABNA0123456789 + */ + readonly source_iban?: string | null; + source_type?: components["schemas"]["AccountTypeProperty"]; + /** + * Format: string + * @description ID of the destination account. For a deposit or a transfer, this must always be an asset account. For withdrawals this must be an expense account. + * @example 2 + */ + destination_id: string | null; + /** + * Format: string + * @description Name of the destination account. You can submit the name instead of the ID. For everything except transfers, the account will be auto-generated if unknown, so submitting a name is enough. + * @example Buy and Large + */ + destination_name?: string | null; + /** + * Format: string + * @example NL02ABNA0123456789 + */ + readonly destination_iban?: string | null; + destination_type?: components["schemas"]["AccountTypeProperty"]; + /** + * Format: string + * @description The budget ID for this transaction. + * @example 4 + */ + budget_id?: string | null; + /** + * Format: string + * @description The name of the budget used. + * @example Groceries + */ + readonly budget_name?: string | null; + /** + * Format: string + * @description The category ID for this transaction. + * @example 43 + */ + category_id?: string | null; + /** + * Format: string + * @description The name of the category to be used. If the category is unknown, it will be created. If the ID and the name point to different categories, the ID overrules the name. + * @example Groceries + */ + category_name?: string | null; + /** + * Format: string + * @description The associated subscription ID for this transaction. `bill` refers to the OLD name for subscriptions and this field will be removed. + * @example 111 + */ + bill_id?: string | null; + /** + * Format: string + * @description The associated subscription name for this transaction. `bill` refers to the OLD name for subscriptions and this field will be removed. + * @example Monthly rent + */ + bill_name?: string | null; + /** + * Format: string + * @description The associated subscription ID for this transaction. + * @example 111 + */ + subscription_id?: string | null; + /** + * Format: string + * @description The associated subscription name for this transaction. + * @example Monthly rent + */ + subscription_name?: string | null; + /** + * @description If the transaction has been reconciled already. When you set this, the amount can no longer be edited by the user. + * @example false + */ + reconciled?: boolean; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * @description Array of tags. + * @example null + */ + tags?: string[] | null; + /** + * Format: string + * @description Reference to internal reference of other systems. + */ + internal_reference?: string | null; + /** + * Format: string + * @description Reference to external ID in other systems. + */ + external_id?: string | null; + /** + * Format: string + * @description External, custom URL for this transaction. + */ + external_url?: string | null; + /** + * Format: string + * @description System generated identifier for original creator of transaction. + */ + readonly original_source?: string | null; + /** + * Format: string + * @description Reference to recurrence that made the transaction. + */ + readonly recurrence_id?: string | null; + /** + * Format: int32 + * @description Total number of transactions expected to be created by this recurrence repetition. Will be 0 if infinite. + * @example 0 + */ + readonly recurrence_total?: number | null; + /** + * Format: int32 + * @description The # of the current transaction created under this recurrence. + * @example 12 + */ + readonly recurrence_count?: number | null; + /** + * Format: string + * @description Hash value of original import transaction (for duplicate detection). + */ + readonly import_hash_v2?: string | null; + /** + * Format: string + * @description SEPA Clearing Code + */ + sepa_cc?: string | null; + /** + * Format: string + * @description SEPA Opposing Account Identifier + */ + sepa_ct_op?: string | null; + /** + * Format: string + * @description SEPA end-to-end Identifier + */ + sepa_ct_id?: string | null; + /** + * Format: string + * @description SEPA mandate identifier + */ + sepa_db?: string | null; + /** + * Format: string + * @description SEPA Country + */ + sepa_country?: string | null; + /** + * Format: string + * @description SEPA External Purpose indicator + */ + sepa_ep?: string | null; + /** + * Format: string + * @description SEPA Creditor Identifier + */ + sepa_ci?: string | null; + /** + * Format: string + * @description SEPA Batch ID + */ + sepa_batch_id?: string | null; + /** Format: date-time */ + interest_date?: string | null; + /** Format: date-time */ + book_date?: string | null; + /** Format: date-time */ + process_date?: string | null; + /** Format: date-time */ + due_date?: string | null; + /** Format: date-time */ + payment_date?: string | null; + /** Format: date-time */ + invoice_date?: string | null; + /** + * Format: double + * @description Latitude of the transaction's location, if applicable. Can be used to draw a map. + * @example 51.983333 + */ + latitude?: number | null; + /** + * Format: double + * @description Latitude of the transaction's location, if applicable. Can be used to draw a map. + * @example 5.916667 + */ + longitude?: number | null; + /** + * Format: int32 + * @description Zoom level for the map, if drawn. This to set the box right. Unfortunately this is a proprietary value because each map provider has different zoom levels. + * @example 6 + */ + zoom_level?: number | null; + /** + * @description If the transaction has attachments. + * @example false + */ + has_attachments?: boolean; + }; + TransactionSplitStore: { + type: components["schemas"]["TransactionTypeProperty"]; + /** + * Format: date-time + * @description Date of the transaction + * @example 2026-10-01T00:00:00+00:00 + */ + date: string; + /** + * Format: amount + * @description Amount of the transaction. + * @example 123.45 + */ + amount: string; + /** + * Format: string + * @description Description of the transaction. + * @example Vegetables + */ + description: string; + /** + * Format: int32 + * @description Order of this entry in the list of transactions. + * @example 0 + */ + order?: number | null; + /** + * Format: string + * @description Currency ID. Default is the source account's currency, or the user's financial administration's currency. The value you submit may be overruled by the source or destination account. + * @example 12 + */ + currency_id?: string | null; + /** + * Format: string + * @description Currency code. Default is the source account's currency, or the user's financial administration's primary currency. The value you submit may be overruled by the source or destination account. + * @example EUR + */ + currency_code?: string | null; + /** + * Format: amount + * @description The amount in a foreign currency. + * @example 123.45 + */ + foreign_amount?: string | null; + /** + * Format: string + * @description Currency ID of the foreign currency. Default is null. Is required when you submit a foreign amount. + * @example 17 + */ + foreign_currency_id?: string | null; + /** + * Format: string + * @description Currency code of the foreign currency. Default is NULL. Can be used instead of the foreign_currency_id, but this or the ID is required when submitting a foreign amount. + * @example USD + */ + foreign_currency_code?: string | null; + /** + * Format: string + * @description The budget ID for this transaction. + * @example 4 + */ + budget_id?: string | null; + /** + * Format: string + * @description The name of the budget to be used. If the budget name is unknown, the ID will be used or the value will be ignored. + * @example Groceries + */ + budget_name?: string | null; + /** + * Format: string + * @description The category ID for this transaction. + * @example 43 + */ + category_id?: string | null; + /** + * Format: string + * @description The name of the category to be used. If the category is unknown, it will be created. If the ID and the name point to different categories, the ID overrules the name. + * @example Groceries + */ + category_name?: string | null; + /** + * Format: string + * @description ID of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. + * @example 2 + */ + source_id?: string | null; + /** + * Format: string + * @description Name of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. Can be used instead of the source_id. If the transaction is a deposit, the source_name can be filled in freely: the account will be created based on the name. + * @example Checking account + */ + source_name?: string | null; + /** + * Format: string + * @description ID of the destination account. For a deposit or a transfer, this must always be an asset account. For withdrawals this must be an expense account. + * @example 2 + */ + destination_id?: string | null; + /** + * Format: string + * @description Name of the destination account. You can submit the name instead of the ID. For everything except transfers, the account will be auto-generated if unknown, so submitting a name is enough. + * @example Buy and Large + */ + destination_name?: string | null; + /** + * @description If the transaction has been reconciled already. When you set this, the amount can no longer be edited by the user. + * @example false + */ + reconciled?: boolean; + /** + * Format: int32 + * @description Optional. Use either this or the piggy_bank_name + */ + piggy_bank_id?: number | null; + /** + * Format: string + * @description Optional. Use either this or the piggy_bank_id + */ + piggy_bank_name?: string | null; + /** + * Format: string + * @description Optional. Use either this or the bill_name + * @example 112 + */ + bill_id?: string | null; + /** + * Format: string + * @description Optional. Use either this or the bill_id + * @example Monthly rent + */ + bill_name?: string | null; + /** + * @description Array of tags. + * @example null + */ + tags?: string[] | null; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: string + * @description Reference to internal reference of other systems. + */ + internal_reference?: string | null; + /** + * Format: string + * @description Reference to external ID in other systems. + */ + external_id?: string | null; + /** + * Format: string + * @description External, custom URL for this transaction. + */ + external_url?: string | null; + /** + * Format: string + * @description SEPA Clearing Code + */ + sepa_cc?: string | null; + /** + * Format: string + * @description SEPA Opposing Account Identifier + */ + sepa_ct_op?: string | null; + /** + * Format: string + * @description SEPA end-to-end Identifier + */ + sepa_ct_id?: string | null; + /** + * Format: string + * @description SEPA mandate identifier + */ + sepa_db?: string | null; + /** + * Format: string + * @description SEPA Country + */ + sepa_country?: string | null; + /** + * Format: string + * @description SEPA External Purpose indicator + */ + sepa_ep?: string | null; + /** + * Format: string + * @description SEPA Creditor Identifier + */ + sepa_ci?: string | null; + /** + * Format: string + * @description SEPA Batch ID + */ + sepa_batch_id?: string | null; + /** Format: date-time */ + interest_date?: string | null; + /** Format: date-time */ + book_date?: string | null; + /** Format: date-time */ + process_date?: string | null; + /** Format: date-time */ + due_date?: string | null; + /** Format: date-time */ + payment_date?: string | null; + /** Format: date-time */ + invoice_date?: string | null; + }; + TransactionSplitUpdate: { + /** + * Format: string + * @description Transaction journal ID of current transaction (split). + * @example 123 + */ + transaction_journal_id?: string; + type?: components["schemas"]["TransactionTypeProperty"]; + /** + * Format: date-time + * @description Date of the transaction + * @example 2026-10-01T00:00:00+00:00 + */ + date?: string; + /** + * Format: amount + * @description Amount of the transaction. + * @example 123.45 + */ + amount?: string; + /** + * Format: string + * @description Description of the transaction. + * @example Vegetables + */ + description?: string; + /** + * Format: int32 + * @description Order of this entry in the list of transactions. + * @example 0 + */ + order?: number | null; + /** + * Format: string + * @description Currency ID. Default is the source account's currency, or the user's financial administration's primary currency. Can be used instead of currency_code. + * @example 12 + */ + currency_id?: string | null; + /** + * Format: string + * @description Currency code. Default is the source account's currency, or the user's financial administration's primary currency. Can be used instead of currency_id. + * @example EUR + */ + currency_code?: string | null; + /** + * Format: string + * @example $ + */ + readonly currency_symbol?: string; + /** + * Format: string + * @example Euro + */ + readonly currency_name?: string; + /** + * Format: int32 + * @description Number of decimals used in this currency. + * @example 2 + */ + readonly currency_decimal_places?: number; + /** + * Format: amount + * @description The amount in a foreign currency. + * @example 123.45 + */ + foreign_amount?: string | null; + /** + * Format: string + * @description Currency ID of the foreign currency. Default is null. Is required when you submit a foreign amount. + * @example 17 + */ + foreign_currency_id?: string | null; + /** + * Format: string + * @description Currency code of the foreign currency. Default is NULL. Can be used instead of the foreign_currency_id, but this or the ID is required when submitting a foreign amount. + * @example USD + */ + foreign_currency_code?: string | null; + /** + * Format: string + * @example $ + */ + readonly foreign_currency_symbol?: string | null; + /** + * Format: int32 + * @description Number of decimals in the currency + * @example 2 + */ + readonly foreign_currency_decimal_places?: number | null; + /** + * Format: string + * @description The budget ID for this transaction. + * @example 4 + */ + budget_id?: string | null; + /** + * Format: string + * @description The name of the budget to be used. If the budget name is unknown, the ID will be used or the value will be ignored. + * @example Groceries + */ + readonly budget_name?: string | null; + /** + * Format: string + * @description The category ID for this transaction. + * @example 43 + */ + category_id?: string | null; + /** + * Format: string + * @description The name of the category to be used. If the category is unknown, it will be created. If the ID and the name point to different categories, the ID overrules the name. + * @example Groceries + */ + category_name?: string | null; + /** + * Format: string + * @description ID of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. + * @example 2 + */ + source_id?: string | null; + /** + * Format: string + * @description Name of the source account. For a withdrawal or a transfer, this must always be an asset account. For deposits, this must be a revenue account. Can be used instead of the source_id. If the transaction is a deposit, the source_name can be filled in freely: the account will be created based on the name. + * @example Checking account + */ + source_name?: string | null; + /** + * Format: string + * @example NL02ABNA0123456789 + */ + source_iban?: string | null; + /** + * Format: string + * @description ID of the destination account. For a deposit or a transfer, this must always be an asset account. For withdrawals this must be an expense account. + * @example 2 + */ + destination_id?: string | null; + /** + * Format: string + * @description Name of the destination account. You can submit the name instead of the ID. For everything except transfers, the account will be auto-generated if unknown, so submitting a name is enough. + * @example Buy and Large + */ + destination_name?: string | null; + /** + * Format: string + * @example NL02ABNA0123456789 + */ + destination_iban?: string | null; + /** + * @description If the transaction has been reconciled already. When you set this, the amount can no longer be edited by the user. + * @example false + */ + reconciled?: boolean; + /** + * Format: string + * @description Optional. Use either this or the bill_name + * @example 111 + */ + bill_id?: string | null; + /** + * Format: string + * @description Optional. Use either this or the bill_id + * @example Monthly rent + */ + bill_name?: string | null; + /** + * @description Array of tags. + * @example null + */ + tags?: string[] | null; + /** + * Format: string + * @example Some example notes + */ + notes?: string | null; + /** + * Format: string + * @description Reference to internal reference of other systems. + */ + internal_reference?: string | null; + /** + * Format: string + * @description Reference to external ID in other systems. + */ + external_id?: string | null; + /** + * Format: string + * @description External, custom URL for this transaction. + */ + external_url?: string | null; + /** + * Format: string + * @description SEPA Clearing Code + */ + sepa_cc?: string | null; + /** + * Format: string + * @description SEPA Opposing Account Identifier + */ + sepa_ct_op?: string | null; + /** + * Format: string + * @description SEPA end-to-end Identifier + */ + sepa_ct_id?: string | null; + /** + * Format: string + * @description SEPA mandate identifier + */ + sepa_db?: string | null; + /** + * Format: string + * @description SEPA Country + */ + sepa_country?: string | null; + /** + * Format: string + * @description SEPA External Purpose indicator + */ + sepa_ep?: string | null; + /** + * Format: string + * @description SEPA Creditor Identifier + */ + sepa_ci?: string | null; + /** + * Format: string + * @description SEPA Batch ID + */ + sepa_batch_id?: string | null; + /** Format: date-time */ + interest_date?: string | null; + /** Format: date-time */ + book_date?: string | null; + /** Format: date-time */ + process_date?: string | null; + /** Format: date-time */ + due_date?: string | null; + /** Format: date-time */ + payment_date?: string | null; + /** Format: date-time */ + invoice_date?: string | null; + }; + /** A single user */ + User: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: email + * @description The new users email address. + * @example james@firefly-iii.org + */ + email: string; + /** + * @description Boolean to indicate if the user is blocked. + * @example false + */ + blocked?: boolean; + blocked_code?: components["schemas"]["UserBlockedCodeProperty"]; + role?: components["schemas"]["UserRoleProperty"]; + }; + UserGroupRead: { + /** + * Format: string + * @description Immutable value + * @example user_groups + */ + type: string; + /** + * Format: string + * @example 2 + */ + id: string; + attributes: components["schemas"]["UserGroupReadAttributes"]; + links: components["schemas"]["ObjectLink"]; + }; + UserGroupReadAttributes: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * @description Is this user group ('financial administration') currently the active administration? + * @example false + */ + readonly in_use?: boolean; + /** + * @description Can the current user see the members of this user group? + * @example true + */ + readonly can_see_members?: boolean; + /** + * Format: string + * @description Title of the user group. By default, it is the same as the user's email address. + * @example demo@firefly + */ + title?: string; + /** + * Format: string + * @description Returns the primary currency ID of the user group. + * @example 12 + */ + readonly primary_currency_id?: string; + /** + * Format: string + * @description Returns the primary currency code of the user group. + * @example EUR + */ + primary_currency_code?: string; + /** + * Format: string + * @description Returns the primary currency symbol of the user group. + * @example $ + */ + readonly primary_currency_symbol?: string; + /** + * Format: int32 + * @description Returns the primary currency decimal places of the user group. + * @example 2 + */ + readonly primary_currency_decimal_places?: number; + members?: components["schemas"]["UserGroupReadMembers"][]; + }; + UserGroupReadMembers: { + /** + * Format: string + * @description The ID of the member. + * @example 5 + */ + readonly user_id?: string; + /** + * Format: email + * @description The email address of the member + * @example james@firefly-iii.org + */ + readonly user_email?: string; + /** + * @description Is this you? (the current user) + * @example false + */ + readonly you?: boolean; + roles?: components["schemas"]["UserGroupReadRole"][]; + }; + /** + * @description The possible roles of the user in this user group are documented here: https://docs.firefly-iii.org/references/firefly-iii/api/ + * @enum {string} + */ + UserGroupReadRole: "ro" | "mng_trx" | "mng_meta" | "read_budgets" | "read_piggies" | "read_subscriptions" | "read_rules" | "read_recurring" | "read_webhooks" | "read_currencies" | "mng_budgets" | "mng_piggies" | "mng_subscriptions" | "mng_rules" | "mng_recurring" | "mng_webhooks" | "mng_currencies" | "view_reports" | "view_memberships" | "full" | "owner"; + UserGroupSingle: { + data: components["schemas"]["UserGroupRead"]; + }; + UserGroupUpdate: { + /** + * Format: string + * @description A descriptive title for the user group. + * @example New user group title + */ + title: string; + /** + * Format: string + * @description Use either primary_currency_id or primary_currency_code. This will set the primary currency for the user group ('financial administration'). + * @example 1 + */ + primary_currency_id?: string; + /** + * Format: string + * @description Use either primary_currency_id or primary_currency_code. This will set the primary currency for the user group ('financial administration'). + * @example EUR + */ + primary_currency_code?: string; + }; + /** + * Format: string + * @description Format of the delivered response. + * @example [ + * "JSON" + * ] + * @enum {string} + */ + WebhookDelivery: "JSON"; + /** + * @example [ + * "JSON" + * ] + */ + WebhookDeliveryArray: components["schemas"]["WebhookDelivery"][]; + /** A single webhook (read) */ + WebhookProperties: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * @description Boolean to indicate if the webhook is active + * @example false + */ + active?: boolean; + /** + * Format: string + * @description A title for the webhook for easy recognition. + * @example Update magic mirror on new transaction + */ + title: string; + /** + * Format: string + * @description A 24-character secret for the webhook. It's generated by Firefly III when saving a new webhook. If you submit a new secret through the PUT endpoint it will generate a new secret for the selected webhook, a new secret bearing no relation to whatever you just submitted. + * @example iMLZLtLx2JHWhK9Dtyuoqyir + */ + readonly secret?: string; + triggers?: components["schemas"]["WebhookTriggerArray"]; + responses?: components["schemas"]["WebhookResponseArray"]; + deliveries?: components["schemas"]["WebhookDeliveryArray"]; + /** + * Format: string + * @description The URL of the webhook. Has to start with `https`. + * @example https://example.com + */ + url: string; + }; + /** + * Format: string + * @description Indicator for what Firefly III will deliver to the webhook URL. + * @example RELEVANT + * @enum {string} + */ + WebhookResponse: "TRANSACTIONS" | "ACCOUNTS" | "BUDGET" | "RELEVANT" | "NONE"; + /** + * @example [ + * "TRANSACTIONS" + * ] + */ + WebhookResponseArray: components["schemas"]["WebhookResponse"][]; + /** A single webhook (store) */ + WebhookStore: { + /** + * @description Boolean to indicate if the webhook is active + * @example false + */ + active?: boolean; + /** + * Format: string + * @description A title for the webhook for easy recognition. + * @example Update magic mirror on new transaction + */ + title: string; + triggers?: components["schemas"]["WebhookTriggerArray"]; + responses?: components["schemas"]["WebhookResponseArray"]; + deliveries?: components["schemas"]["WebhookDeliveryArray"]; + /** + * Format: string + * @description The URL of the webhook. Has to start with `https`. + * @example https://example.com + */ + url: string; + }; + /** + * Format: string + * @description The trigger for the webhook. + * @example DESTROY_TRANSACTION + * @enum {string} + */ + WebhookTrigger: "ANY" | "STORE_TRANSACTION" | "UPDATE_TRANSACTION" | "DESTROY_TRANSACTION" | "STORE_BUDGET" | "UPDATE_BUDGET" | "DESTROY_BUDGET" | "STORE_UPDATE_BUDGET_LIMIT"; + /** + * @example [ + * "STORE_TRANSACTION", + * "UPDATE_TRANSACTION" + * ] + */ + WebhookTriggerArray: components["schemas"]["WebhookTrigger"][]; + /** A single webhook (update) */ + WebhookUpdate: { + /** + * @description Boolean to indicate if the webhook is active + * @example false + */ + active?: boolean; + /** + * Format: string + * @description A title for the webhook for easy recognition. + * @example Update magic mirror on new transaction + */ + title?: string; + /** + * Format: string + * @description A 24-character secret for the webhook. It's generated by Firefly III when saving a new webhook. If you submit a new secret through the PUT endpoint it will generate a new secret for the selected webhook, a new secret bearing no relation to whatever you just submitted. + * @example iMLZLtLx2JHWhK9Dtyuoqyir + */ + secret?: string; + triggers?: components["schemas"]["WebhookTriggerArray"]; + responses?: components["schemas"]["WebhookResponseArray"]; + deliveries?: components["schemas"]["WebhookDeliveryArray"]; + /** + * Format: string + * @description The URL of the webhook. Has to start with `https`. + * @example https://example.com + */ + url?: string; + }; + WebhookAttempt: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * Format: string + * @description The ID of the webhook message this attempt belongs to. + * @example 5 + */ + webhook_message_id?: string; + /** + * Format: int32 + * @description The HTTP status code of the error, if any. + * @example 404 + */ + status_code?: number | null; + /** + * Format: string + * @description Internal log for this attempt. May contain sensitive user data. + * @example Page not found + */ + logs?: string | null; + /** + * Format: amount + * @description Webhook receiver response for this attempt, if any. May contain sensitive user data. + * @example Page not found + */ + response?: string | null; + }; + WebhookMessage: { + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly created_at?: string; + /** + * Format: date-time + * @example 2026-10-01T00:00:00+00:00 + */ + readonly updated_at?: string; + /** + * @description If this message is sent yet. + * @example false + */ + sent?: boolean; + /** + * @description If this message has errored out. + * @example false + */ + errored?: boolean; + /** + * Format: string + * @description The ID of the webhook this message belongs to. + * @example 5 + */ + webhook_id?: string; + /** + * Format: string + * @description Long UUID string for identification of this webhook message. + * @example 7a344c02-5b52-46b1-90e6-a437431dcf07 + */ + uuid?: string; + /** + * Format: string + * @description The actual message that is sent or will be sent as JSON string. + * @example {some:message} + */ + message?: string | null; + }; + /** + * Format: string + * @description The object class to which the attachment must be linked. + * @example Bill + * @enum {string} + */ + AttachableType: "Account" | "Budget" | "Bill" | "TransactionJournal" | "PiggyBank" | "Tag"; + /** + * Format: string + * @description Period for the auto budget + * @example monthly + * @enum {string|null} + */ + AutoBudgetPeriod: "daily" | "weekly" | "monthly" | "quarterly" | "half-year" | "yearly" | null; + /** + * Format: string + * @description The type of auto-budget that Firefly III must create. + * @example reset + * @enum {string|null} + */ + AutoBudgetType: "reset" | "rollover" | "none" | null; + /** + * Format: string + * @description How often the bill must be paid. + * @example monthly + * @enum {string} + */ + BillRepeatFrequency: "weekly" | "monthly" | "quarterly" | "half-year" | "yearly"; + PolymorphicProperty: boolean | string | Record | components["schemas"]["StringArrayItem"][]; + /** + * Format: string + * @description The type of the repetition. ndom means: the n-th weekday of the month, where you can also specify which day of the week. + * @example weekly + * @enum {string} + */ + RecurrenceRepetitionType: "daily" | "weekly" | "ndom" | "monthly" | "yearly"; + /** + * Format: string + * @example withdrawal + * @enum {string} + */ + RecurrenceTransactionType: "withdrawal" | "transfer" | "deposit"; + /** + * Format: string + * @description The type of thing this action will do. A limited set is possible. + * @example set_category + * @enum {string} + */ + RuleActionKeyword: "user_action" | "set_category" | "clear_category" | "set_budget" | "clear_budget" | "add_tag" | "remove_tag" | "remove_all_tags" | "set_description" | "append_description" | "prepend_description" | "set_source_account" | "set_destination_account" | "set_notes" | "append_notes" | "prepend_notes" | "clear_notes" | "link_to_bill" | "convert_withdrawal" | "convert_deposit" | "convert_transfer" | "delete_transaction"; + /** + * Format: string + * @description The type of thing this trigger responds to. A limited set is possible + * @example user_action + * @enum {string} + */ + RuleTriggerKeyword: "from_account_starts" | "from_account_ends" | "from_account_is" | "from_account_contains" | "to_account_starts" | "to_account_ends" | "to_account_is" | "to_account_contains" | "amount_less" | "amount_exactly" | "amount_more" | "description_starts" | "description_ends" | "description_contains" | "description_is" | "transaction_type" | "category_is" | "budget_is" | "tag_is" | "currency_is" | "has_attachments" | "has_no_category" | "has_any_category" | "has_no_budget" | "has_any_budget" | "has_no_tag" | "has_any_tag" | "notes_contains" | "notes_starts" | "notes_end" | "notes_are" | "no_notes" | "any_notes" | "source_account_is" | "destination_account_is" | "source_account_starts"; + /** + * Format: string + * @description Which action is necessary for the rule to fire? Use either store-journal, update-journal or manual-activation. + * @example store-journal + * @enum {string} + */ + RuleTriggerType: "store-journal" | "update-journal" | "manual-activation"; + /** + * Format: string + * @description The actual preference content. + * @example EUR + */ + StringArrayItem: string; + /** + * Format: string + * @description If you say the user must be blocked, this will be the reason code. + * @example email_changed + * @enum {string|null} + */ + UserBlockedCodeProperty: "email_changed" | null; + /** + * Format: string + * @description Role for the user. Can be empty or omitted. + * @example owner + * @enum {string|null} + */ + UserRoleProperty: "owner" | "demo" | null; + BasicSummary: { + [key: string]: components["schemas"]["BasicSummaryEntry"]; + }; + BasicSummaryEntry: { + /** + * Format: string + * @description This is a reference to the type of info shared, not influenced by translations or user preferences. The EUR value is a reference to the currency code. Possibilities are: balance-in-ABC, spent-in-ABC, earned-in-ABC, bills-paid-in-ABC, bills-unpaid-in-ABC, left-to-spend-in-ABC and net-worth-in-ABC. + * @example balance-in-EUR + */ + key?: string; + /** + * Format: string + * @description A translated title for the information shared. + * @example Balance ($) + */ + title?: string; + /** + * Format: double + * @description The amount as a float. + * @example 123.45 + */ + monetary_value?: number; + /** + * Format: string + * @description The currency ID of the associated currency. + * @example 5 + */ + currency_id?: string; + /** + * Format: string + * @example EUR + */ + currency_code?: string; + /** + * Format: string + * @example $ + */ + currency_symbol?: string; + /** + * Format: int32 + * @description Number of decimals for the associated currency. + * @example 2 + */ + currency_decimal_places?: number; + /** + * @description True if there are no available budgets available. + * @example false + */ + no_available_budgets?: boolean; + /** + * Format: string + * @description The amount formatted according to the users locale + * @example $ 12.45 + */ + value_parsed?: string; + /** + * Format: string + * @description A short explanation of the amounts origin. Already formatted according to the locale of the user or translated, if relevant. + * @example $20 + $-40 + */ + sub_title?: string; + }; + Configuration: { + title: components["schemas"]["ConfigValueFilter"]; + value: components["schemas"]["PolymorphicProperty"]; + /** + * @description If this config variable can be edited by the user + * @example true + */ + editable: boolean; + }; + ConfigurationUpdate: { + value: components["schemas"]["PolymorphicProperty"]; + }; + CronResult: { + recurring_transactions?: components["schemas"]["CronResultRow"][]; + auto_budgets?: components["schemas"]["CronResultRow"][]; + exchange_rates?: components["schemas"]["CronResultRow"][]; + bill_notifications?: components["schemas"]["CronResultRow"][]; + webhooks?: components["schemas"]["CronResultRow"][]; + }; + CronResultRow: { + /** + * @description This value tells you if this specific cron job actually fired. It may not fire. Some cron jobs + * only fire every 24 hours, for example. + * @example true + */ + job_fired?: boolean | null; + /** + * @description This value tells you if this specific cron job actually did something. The job may fire but not + * change anything. + * @example true + */ + job_succeeded?: boolean | null; + /** + * @description If the cron job ran into some kind of an error, this value will be true. + * @example false + */ + job_errored?: boolean | null; + /** + * Format: string + * @description If the cron job ran into some kind of an error, this value will be the error message. The success message + * if the job actually ran OK. + * @example Cron result message + */ + message?: string | null; + /** + * Format: string + * @description The user for which this particular job result is. + * @example 1 + */ + user?: string; + }; + ReleaseNotes: { + /** + * Format: string + * @example 6.7.8 + */ + version?: string; + /** + * Format: string + * @description The release notes as HTML. + */ + release_notes?: string | null; + /** + * Format: string + * @description The release notes in Markdown format. + */ + release_notes_markdown?: string | null; + }; + SystemInfo: { + data?: { + /** + * Format: string + * @example 6.7.8 + */ + version?: string; + /** + * Format: string + * @description Same value as the version field. + * @example 6.7.8 + */ + api_version?: string; + /** + * Format: string + * @example 8.1.5 + */ + php_version?: string; + /** + * Format: string + * @example Linux + */ + os?: string; + /** + * Format: string + * @example mysql + */ + driver?: string; + }; + }; + UserSingle: { + data: components["schemas"]["UserRead"]; + }; + /** @enum {string} */ + AccountTypeFilter: "all" | "asset" | "cash" | "expense" | "revenue" | "special" | "hidden" | "liability" | "liabilities" | "Default account" | "Cash account" | "Asset account" | "Expense account" | "Revenue account" | "Initial balance account" | "Beneficiary account" | "Import account" | "Reconciliation account" | "Loan" | "Debt" | "Mortgage"; + /** @enum {string} */ + TransactionTypeFilter: "all" | "withdrawal" | "withdrawals" | "expense" | "deposit" | "deposits" | "income" | "transfer" | "transfers" | "opening_balance" | "reconciliation" | "special" | "specials" | "default"; + Meta: { + pagination?: { + /** @example 3 */ + total?: number; + /** @example 20 */ + count?: number; + /** @example 100 */ + per_page?: number; + /** @example 1 */ + current_page?: number; + /** @example 1 */ + total_pages?: number; + }; + }; + /** + * Format: string + * @description Is only mandatory when the type is asset. + * @example defaultAsset + * @enum {string|null} + */ + AccountRoleProperty: "defaultAsset" | "sharedAsset" | "savingAsset" | "ccAsset" | "cashWalletAsset" | null; + /** + * Format: string + * @example Asset account + * @enum {string} + */ + AccountTypeProperty: "Default account" | "Cash account" | "Asset account" | "Expense account" | "Revenue account" | "Initial balance account" | "Beneficiary account" | "Import account" | "Reconciliation account" | "Loan" | "Debt" | "Mortgage"; + /** + * Format: string + * @description Period of the chart. + * @example 1M + * @enum {string} + */ + ChartDatasetPeriodProperty: "1D" | "1W" | "1M" | "3M" | "1Y" | "custom"; + /** + * Format: string + * @description Mandatory when the account_role is ccAsset. Can only be monthlyFull or null. + * @example monthlyFull + * @enum {string|null} + */ + CreditCardTypeProperty: "monthlyFull" | null; + /** + * Format: string + * @description Mandatory when type is liability. Period over which the interest is calculated. + * @example monthly + * @enum {string|null} + */ + InterestPeriodProperty: "daily" | "weekly" | "monthly" | "quarterly" | "half-year" | "yearly" | null; + /** + * Format: string + * @description 'credit' indicates somebody owes you the liability. 'debit' Indicates you owe this debt yourself. Works only for liabilities. + * @example credit + * @enum {string|null} + */ + LiabilityDirectionProperty: "credit" | "debit" | null; + /** + * Format: string + * @description Mandatory when type is liability. Specifies the exact type. + * @example loan + * @enum {string|null} + */ + LiabilityTypeProperty: "loan" | "debt" | "mortgage" | null; + /** + * Format: string + * @description Can only be one one these account types. import, initial-balance and reconciliation cannot be set manually. + * @example asset + * @enum {string} + */ + ShortAccountTypeProperty: "asset" | "expense" | "import" | "revenue" | "cash" | "liability" | "liabilities" | "initial-balance" | "reconciliation"; + /** + * Format: string + * @example withdrawal + * @enum {string} + */ + TransactionTypeProperty: "withdrawal" | "deposit" | "transfer" | "reconciliation" | "opening balance"; + BadRequestResponse: { + /** + * Format: string + * @example Bad Request + */ + message?: string; + /** + * Format: string + * @example BadRequestHttpException + */ + exception?: string; + }; + InternalExceptionResponse: { + /** + * Format: string + * @example Internal Exception + */ + message?: string; + /** + * Format: string + * @example InternalException + */ + exception?: string; + }; + NotFoundResponse: { + /** + * Format: string + * @example Resource not found + */ + message?: string; + /** + * Format: string + * @example NotFoundHttpException + */ + exception?: string; + }; + UnauthenticatedResponse: { + /** + * Format: string + * @example Unauthenticated + */ + message?: string; + /** + * Format: string + * @example AuthenticationException + */ + exception?: string; + }; + ValidationErrorResponse: { + /** + * Format: string + * @example The given data was invalid. + */ + message?: string; + errors?: { + email?: string[]; + force?: string[]; + blocked?: string[]; + field?: string[]; + role?: string[]; + blocked_code?: string[]; + name?: string[]; + type?: string[]; + iban?: string[]; + start?: string[]; + end?: string[]; + date?: string[]; + }; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getAccountsAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + /** + * @description If the account is an asset account or a liability, the autocomplete will also return the balance of the account on this date in the AC title. + * @example 2026-10-01 + */ + date?: string; + /** @description Optional filter on the account type(s) used in the autocomplete. */ + types?: components["schemas"]["AccountTypeFilter"][]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of accounts with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteAccountArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getBillsAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of bills with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteBillArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getBudgetsAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of budgets with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteBudgetArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getCategoriesAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of categories with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteCategoryArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getCurrenciesAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of currencies with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteCurrencyArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getObjectGroupsAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of object groups with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteObjectGroupArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getPiggiesAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of piggy banks with basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompletePiggyBalanceArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getRecurringAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of recurring transactions with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteRecurrenceArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getRuleGroupsAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of rule groups with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteRuleGroupArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getRulesAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of rules with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteRuleArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getSubscriptionsAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of subscriptions with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteBillArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getTagAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of tags with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteTagArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getTransactionTypesAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transaction types with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteTransactionTypeArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getTransactionsAC: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transaction descriptions with very basic information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteTransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getTransactionsWithMeta: { + parameters: { + query?: { + /** + * @description The autocomplete search query. + * @example string + */ + query?: string; + /** + * @description The number of items returned. + * @example 10 + */ + limit?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Returns all transactions, complemented with meta information. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["AutocompleteTransactionWithMetaArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getChartAccountOverview: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description Optional period to group the data by. If not provided, it will default to '1M' or whatever is deemed relevant for the range provided. + * + * If you want to know which periods are available, see the enums or get the configuration value: `GET /api/v1/configuration/firefly.valid_view_ranges` + */ + period?: "1D" | "1W" | "1M" | "3M" | "6M" | "1Y"; + /** + * @description Optional set of preselected accounts to limit the chart to. This may be easier than submitting all asset accounts manually, for example. + * If you want to know which selection are available, see the enums here or get the configuration value: `GET /api/v1/configuration/firefly.preselected_accounts` + * + * - `empty`: do not do a pre-selection + * - `all`: select all asset and all liability accounts + * - `assets`: select all asset accounts + * - `liabilities`: select all liability accounts + * + * If no accounts are found, the user's "frontpage accounts" preference will be used. If that is empty, all asset accounts will be used. + */ + preselected?: "empty" | "all" | "assets" | "liabilities"; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Line chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ChartLine"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getChartBalance: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description Optional period to group the data by. If not provided, it will default to '1M' or whatever is deemed relevant for the range provided. + * + * If you want to know which periods are available, see the enums or get the configuration value: `GET /api/v1/configuration/firefly.valid_view_ranges` + */ + period?: "1D" | "1W" | "1M" | "3M" | "6M" | "1Y"; + /** + * @description Optional set of preselected accounts to limit the chart to. This may be easier than submitting all asset accounts manually, for example. + * If you want to know which selection are available, see the enums here or get the configuration value: `GET /api/v1/configuration/firefly.preselected_accounts` + * + * - `empty`: do not do a pre-selection + * - `all`: select all asset and all liability accounts + * - `assets`: select all asset accounts + * - `liabilities`: select all liability accounts + * + * If no accounts are found, the user's "frontpage accounts" preference will be used. If that is empty, all asset accounts will be used. + */ + preselected?: "empty" | "all" | "assets" | "liabilities"; + /** + * @description Limit the chart to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. + * + * This list of accounts will be OVERRULED by the `preselected` parameter. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Line chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ChartLine"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getChartBudgetOverview: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Bar chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ChartLine"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getChartBudgetOverviewWithLimits: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Bar chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ChartLine"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getChartCategoryOverview: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Line chart oriented chart information. Check out the model for more details. Each entry is a line (or bar) in the chart. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ChartLine"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + bulkUpdateTransactions: { + parameters: { + query: { + /** @description The JSON query. */ + query: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Empty response when the update was successful. A future improvement is to include the changed transactions. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + destroyData: { + parameters: { + query: { + /** @description The type of data that you wish to destroy. You can only use one at a time. */ + objects: components["schemas"]["DataDestroyObject"]; + /** + * @description Only applies when "objects" is set to: not_assets_liabilities, accounts, asset_accounts, expense_accounts, revenue_accounts or liabilities. + * + * If set to true, only unused accounts will be destroyed. This effectively cleans up the autocomplete dropdowns. + */ + unused?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Empty response when data has been destroyed. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportAccounts: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportBills: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportSubscriptions: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportBudgets: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportCategories: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportPiggies: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportRecurring: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportRules: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportTags: { + parameters: { + query?: { + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + exportTransactions: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description Limit the export of transactions to these accounts only. Only asset accounts will be accepted. Other types will be silently dropped. + * @example 1,2,3 + */ + accounts?: string; + /** @description The file type the export file (CSV is currently the only option). */ + type?: components["schemas"]["ExportFileFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exported transaction in a file. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + purgeData: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Empty response when data has been purged. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseExpense: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you add the accounts ID's of expense accounts, only those accounts + * are included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. You can combine both asset / liability and expense account ID's. + * Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of expense accounts and expense details. Each expense account has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseAsset: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of asset accounts and expense details. Each asset account has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightIncomeRevenue: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you add the accounts ID's of revenue accounts, only those accounts + * are included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + * asset accounts / liabilities will be included. You can combine both asset / liability and deposit account ID's. + * Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of revenue accounts and income details. Each revenue account has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightIncomeAsset: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of asset accounts and income details. Each asset account has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightTransfers: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of asset accounts and transfer details. Each asset account has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTransfer"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseBill: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description The bills to be included in the results. */ + "bills[]"?: number[]; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of budget and expense details. Each budget has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseNoBill: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of expense details. One row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseBudget: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description The budgets to be included in the results. */ + "budgets[]"?: number[]; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of budget and expense details. Each budget has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseNoBudget: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of expense details. One row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseCategory: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description The categories to be included in the results. */ + "categories[]"?: number[]; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of category and expense details. Each category has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseNoCategory: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of expense details. One row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightIncomeCategory: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description The categories to be included in the results. */ + "categories[]"?: number[]; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of category and income details. Each category has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightIncomeNoCategory: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of income details. One row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightTransferCategory: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description The categories to be included in the results. */ + "categories[]"?: number[]; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of category and transfer details. Each category has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightTransferNoCategory: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transfer details. One row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseTag: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description The tags to be included in the results. */ + "tags[]"?: number[]; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of tag and expense details. Each tag has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseNoTag: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of expense details. One row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightIncomeTag: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description The tags to be included in the results. */ + "tags[]"?: number[]; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of tag and income details. Each tag has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightIncomeNoTag: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of income details. One row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightTransferTag: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description The tags to be included in the results. */ + "tags[]"?: number[]; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of tag and transfer details. Each tag has one row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightGroup"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightTransferNoTag: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transfer details. One row per currency. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightExpenseTotal: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only withdrawals from those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of sums in different currencies. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightIncomeTotal: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only deposits to those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of sums in different currencies. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + insightTransferTotal: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** + * @description The accounts to be included in the results. If you include ID's of asset accounts or liabilities, only transfers between those + * asset accounts / liabilities will be included. Other account ID's will be ignored. + */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of sums in different currencies. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InsightTotal"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByAccount: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. */ + end?: string; + /** @description Optional filter on the transaction type(s) returned. */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachmentByAccount: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listPiggyBankByAccount: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of piggy banks */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PiggyBankArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAccount: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description Should the endpoint return only active objects or inactive ones? Will be both if not applied. */ + active?: boolean; + /** @description A date formatted YYYY-MM-DD. May be omitted. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. Must be after "start". Can not be the same as "start". May be omitted. */ + end?: string; + /** @description A date formatted YYYY-MM-DD. When added to the request, Firefly III will show the account's balance on that day. */ + date?: string; + /** @description Optional filter on the account type(s) returned */ + type?: components["schemas"]["AccountTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of accounts */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AccountArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeAccount: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array with the necessary account information or key=value pairs. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["AccountStore"]; + "application/x-www-form-urlencoded": components["schemas"]["AccountStore"]; + }; + }; + responses: { + /** @description New account stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AccountSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getAccount: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD. May be omitted. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. Must be after "start". Can not be the same as "start". May be omitted. */ + end?: string; + /** @description A date formatted YYYY-MM-DD. When added to the request, Firefly III will show the account's balance on that day. */ + date?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested account */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AccountSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateAccount: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array or form-data with updated account information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["AccountUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["AccountUpdate"]; + }; + }; + responses: { + /** @description Updated account stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AccountSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteAccount: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Account deleted */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachment: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeAttachment: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary attachment information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["AttachmentStore"]; + "application/x-www-form-urlencoded": components["schemas"]["AttachmentStore"]; + }; + }; + responses: { + /** @description New attachment stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getAttachment: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the attachment. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested attachment */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateAttachment: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the attachment. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated attachment information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["AttachmentUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["AttachmentUpdate"]; + }; + }; + responses: { + /** @description Updated attachment stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteAttachment: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the single attachment. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Attachment deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + downloadAttachment: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the attachment. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested attachment */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/octet-stream": string; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + uploadAttachment: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the attachment. */ + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/octet-stream": string; + }; + }; + responses: { + /** @description Upload was a success */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAvailableBudgets: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of available budget amounts. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AvailableBudgetArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getAvailableBudget: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the available budget. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested available budget */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AvailableBudgetSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachmentByBill: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the bill. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listRuleByBill: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the bill. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of rules */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByBill: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. */ + end?: string; + /** @description Optional filter on the transaction type(s) returned */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the bill. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listBill: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. If it is are added to the request, Firefly III will calculate the appropriate payment and paid dates. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. If it is added to the request, Firefly III will calculate the appropriate payment and paid dates. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of bills */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeBill: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary bill information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["BillStore"]; + "application/x-www-form-urlencoded": components["schemas"]["BillStore"]; + }; + }; + responses: { + /** @description New bill stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getBill: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD. If it is are added to the request, Firefly III will calculate the appropriate payment and paid dates. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. If it is added to the request, Firefly III will calculate the appropriate payment and paid dates. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the bill. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested bill */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateBill: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the bill. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array or key=value pairs with updated bill information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["BillUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["BillUpdate"]; + }; + }; + responses: { + /** @description Updated bill stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteBill: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the bill. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Bill deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByBudgetLimit: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description Optional filter on the transaction type(s) returned */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. The budget limit MUST be associated to the budget ID. */ + id: string; + /** @description The ID of the budget limit. The budget limit MUST be associated to the budget ID. */ + limitId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listBudgetLimitByBudget: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the requested budget. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of budget limits applicable to this budget. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetLimitArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeBudgetLimit: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary budget information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["BudgetLimitStore"]; + "application/x-www-form-urlencoded": components["schemas"]["BudgetLimitStore"]; + }; + }; + responses: { + /** @description New budget limit stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetLimitSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getBudgetLimit: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. The budget limit MUST be associated to the budget ID. */ + id: string; + /** @description The ID of the budget limit. The budget limit MUST be associated to the budget ID. */ + limitId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested budget limit */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetLimitSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateBudgetLimit: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. The budget limit MUST be associated to the budget ID. */ + id: string; + /** @description The ID of the budget limit. The budget limit MUST be associated to the budget ID. */ + limitId: string; + }; + cookie?: never; + }; + /** @description JSON array with updated budget limit information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["BudgetLimitUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["BudgetLimitUpdate"]; + }; + }; + responses: { + /** @description Updated budget limit stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetLimitSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteBudgetLimit: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. The budget limit MUST be associated to the budget ID. */ + id: string; + /** @description The ID of the budget limit. The budget limit MUST be associated to the budget ID. */ + limitId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Budget limit deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listBudgetLimit: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of budget limits. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetLimitArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByBudget: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. */ + end?: string; + /** @description Optional filter on the transaction type(s) returned */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachmentByBudget: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionWithoutBudget: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listBudget: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD, to get info on how much the user has spent. You must submit both start and end. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to get info on how much the user has spent. You must submit both start and end. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of budgets. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeBudget: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary budget information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["BudgetStore"]; + "application/x-www-form-urlencoded": components["schemas"]["BudgetStore"]; + }; + }; + responses: { + /** @description New budget stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getBudget: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD, to get info on how much the user has spent. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to get info on how much the user has spent. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the requested budget. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested budget */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateBudget: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated budget information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["BudgetUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["BudgetUpdate"]; + }; + }; + responses: { + /** @description Updated budget stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteBudget: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the budget. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Budget deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByCategory: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD, to limit the result list. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to limit the result list. */ + end?: string; + /** @description Optional filter on the transaction type(s) returned */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the category. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachmentByCategory: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the category. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listCategory: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of categories. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CategoryArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeCategory: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary category information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["CategoryStore"]; + "application/x-www-form-urlencoded": components["schemas"]["CategoryStore"]; + }; + }; + responses: { + /** @description New category stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CategorySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getCategory: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD, to show spent and earned info. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to show spent and earned info. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the category. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested category */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CategorySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateCategory: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the category. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated category information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["CategoryUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["CategoryUpdate"]; + }; + }; + responses: { + /** @description Updated category stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CategorySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteCategory: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the category. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Category deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listCurrencyExchangeRates: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of all available currency exchange rates. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeCurrencyExchangeRate: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary exchange rate information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["CurrencyExchangeRateStore"]; + "application/x-www-form-urlencoded": components["schemas"]["CurrencyExchangeRateStore"]; + }; + }; + responses: { + /** @description New exchange stored, result in response. If a rate already exists for this currency pair and date, it will be updated. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listSpecificCurrencyExchangeRate: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the requested currency exchange rate. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The exchange rate requested. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateCurrencyExchangeRate: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the currency exchange rate. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array or form-data with updated exchange rate information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["CurrencyExchangeRateUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["CurrencyExchangeRateUpdate"]; + }; + }; + responses: { + /** @description Updated exchange rate stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + }; + }; + deleteSpecificCurrencyExchangeRate: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the requested currency exchange rate. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Currency exchange rate deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listSpecificCurrencyExchangeRates: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code of the 'from' currency. */ + from: string; + /** @description The currency code of the 'to' currency. */ + to: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of currency exchange rates. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteSpecificCurrencyExchangeRates: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code of the 'from' currency. */ + from: string; + /** @description The currency code of the 'to' currency. */ + to: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Currency exchange rate(s) deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listSpecificCurrencyExchangeRateOnDate: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code of the 'from' currency. */ + from: string; + /** @description The currency code of the 'to' currency. */ + to: string; + /** @example 2026-10-01 */ + date: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of currency exchange rates. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateCurrencyExchangeRateByDate: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code of the 'from' currency. */ + from: string; + /** @description The currency code of the 'to' currency. */ + to: string; + /** @example 2026-10-01 */ + date: string; + }; + cookie?: never; + }; + /** @description JSON array or form-data with updated exchange rate information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["CurrencyExchangeRateUpdateNoDate"]; + "application/x-www-form-urlencoded": components["schemas"]["CurrencyExchangeRateUpdate"]; + }; + }; + responses: { + /** @description Updated exchange rate stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + }; + }; + deleteSpecificCurrencyExchangeRateOnDate: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code of the 'from' currency. */ + from: string; + /** @description The currency code of the 'to' currency. */ + to: string; + /** @example 2026-10-01 */ + date: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Currency exchange rate(s) deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeCurrencyExchangeRatesByDate: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @example 2026-10-01 */ + date: string; + }; + cookie?: never; + }; + /** @description JSON array with the necessary currency exchange rate information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["CurrencyExchangeRateStoreByDate"]; + }; + }; + responses: { + /** @description New exchange rates stored, result in response. If a rate already existed for any submitted entry, it will be updated. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeCurrencyExchangeRatesByPair: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code of the 'from' currency. */ + from: string; + /** @description The currency code of the 'to' currency. */ + to: string; + }; + cookie?: never; + }; + /** @description JSON array with the necessary currency exchange rate information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["CurrencyExchangeRateStoreByPair"]; + }; + }; + responses: { + /** @description New exchange rates stored, result in response. If a rate already existed for any submitted entry, it will be updated. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByLinkType: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD, to limit the results. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to limit the results. */ + end?: string; + /** @description Optional filter on the transaction type(s) returned. */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the link type. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listLinkType: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of link types. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["LinkTypeArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeLinkType: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array with the necessary link type information or key=value pairs. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["LinkType"]; + "application/x-www-form-urlencoded": components["schemas"]["LinkType"]; + }; + }; + responses: { + /** @description New link type stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["LinkTypeSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getLinkType: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the link type. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested link type */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["LinkTypeSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateLinkType: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the link type. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array or form-data with updated link type information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["LinkTypeUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["LinkTypeUpdate"]; + }; + }; + responses: { + /** @description Updated link type stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["LinkTypeSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteLinkType: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the link type. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Link type deleted */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionLink: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transaction links */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionLinkArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeTransactionLink: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array with the necessary link type information or key=value pairs. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["TransactionLinkStore"]; + "application/x-www-form-urlencoded": components["schemas"]["TransactionLinkStore"]; + }; + }; + responses: { + /** @description New transaction link stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionLinkSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getTransactionLink: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction link. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested link */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionLinkSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateTransactionLink: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction link. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array or form-data with updated link type information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["TransactionLinkUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["TransactionLinkUpdate"]; + }; + }; + responses: { + /** @description Updated link type stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionLinkSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteTransactionLink: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction link. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Transaction link deleted */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listPiggyBankByObjectGroup: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of piggy banks */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PiggyBankArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listBillByObjectGroup: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of bills. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listObjectGroups: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of object groups */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["ObjectGroupArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getObjectGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the object group. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested object group */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["ObjectGroupSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateObjectGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the object group */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated piggy bank information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["ObjectGroupUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["ObjectGroupUpdate"]; + }; + }; + responses: { + /** @description Updated object group stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["ObjectGroupSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteObjectGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the object group. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Object group deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listEventByPiggyBank: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the piggy bank */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of piggy bank related events */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PiggyBankEventArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachmentByPiggyBank: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the piggy bank. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAccountByPiggyBank: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the piggy bank. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of accounts */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AccountArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listPiggyBank: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of piggy banks */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PiggyBankArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storePiggyBank: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary piggy bank information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["PiggyBankStore"]; + "application/x-www-form-urlencoded": components["schemas"]["PiggyBankStore"]; + }; + }; + responses: { + /** @description New piggy bank stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PiggyBankSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getPiggyBank: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the piggy bank. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested piggy bank */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PiggyBankSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updatePiggyBank: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the piggy bank */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated piggy bank information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["PiggyBankUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["PiggyBankUpdate"]; + }; + }; + responses: { + /** @description Updated piggy bank stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PiggyBankSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deletePiggyBank: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the piggy bank. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Piggy bank deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByRecurrence: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. Both the start and end date must be present. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. Both the start and end date must be present. */ + end?: string; + /** @description Optional filter on the transaction type(s) returned */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the recurring transaction. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listRecurrence: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of recurring transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RecurrenceArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeRecurrence: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary recurring transaction information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["RecurrenceStore"]; + "application/x-www-form-urlencoded": components["schemas"]["RecurrenceStore"]; + }; + }; + responses: { + /** @description New recurring transaction stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RecurrenceSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getRecurrence: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the recurring transaction. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested recurring transaction */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RecurrenceSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateRecurrence: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the recurring transaction. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated recurring transaction information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["RecurrenceUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["RecurrenceUpdate"]; + }; + }; + responses: { + /** @description Updated recurring transaction stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RecurrenceSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteRecurrence: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the recurring transaction. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Recurring transaction deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + triggerRecurrenceRecurrence: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. This is the date for which you want the recurrence to fire. You can take the date from the list of occurrences in the recurring transaction. */ + date: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the recurring transaction. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions (always just 1) created by the recurrence, or a list of zero (0) when there is nothing to create for this date. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listRuleByGroup: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule group. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of rules. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + testRuleGroup: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD, to limit the transactions the test will be applied to. Both the start date and the end date must be present. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to limit the transactions the test will be applied to. Both the start date and the end date must be present. */ + end?: string; + /** @description Maximum number of transactions Firefly III will try. Don't set this too high, or it will take Firefly III very long to run the test. I suggest a max of 200. */ + search_limit?: number; + /** @description Maximum number of transactions the rule group can actually trigger on, before Firefly III stops. I would suggest setting this to 10 or 15. Don't go above the user's page size, because browsing to page 2 or 3 of a test result would fire the test again, making any navigation efforts very slow. */ + triggered_limit?: number; + /** @description Limit the testing of the rule group to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule group. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions that would be changed by any of the rules of the rule group. No changes will be made. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + fireRuleGroup: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD, to limit the transactions the actions will be applied to. Both the start date and the end date must be present. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to limit the transactions the actions will be applied to. Both the start date and the end date must be present. */ + end?: string; + /** @description Limit the triggering of the rule group to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule group. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The rules in the group are executed. Due to the setup of this function (asynchronous job execution) the result cannot be displayed. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listRuleGroup: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of rule groups. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleGroupArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeRuleGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary rule group information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["RuleGroupStore"]; + "application/x-www-form-urlencoded": components["schemas"]["RuleGroupStore"]; + }; + }; + responses: { + /** @description New rule group stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleGroupSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getRuleGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule group. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested rule group */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleGroupSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateRuleGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule group. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated rule group information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["RuleGroupUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["RuleGroupUpdate"]; + }; + }; + responses: { + /** @description Updated rule group stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleGroupSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteRuleGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule group. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Rule group deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + testRule: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD, to limit the transactions the test will be applied to. Both the start date and the end date must be present. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to limit the transactions the test will be applied to. Both the start date and the end date must be present. */ + end?: string; + /** @description Limit the testing of the rule to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions that would be changed by the rule. No changes will be made. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + fireRule: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD, to limit the transactions the actions will be applied to. If the start date is not present, it will be set to one year ago. If you use this field, both the start date and the end date must be present. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to limit the transactions the actions will be applied to. If the end date is not present, it will be set to today. If you use this field, both the start date and the end date must be present. */ + end?: string; + /** @description Limit the triggering of the rule to these asset accounts or liabilities. Only asset accounts and liabilities will be accepted. Other types will be silently dropped. */ + "accounts[]"?: number[]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The rules in the group are executed. Due to the setup of this function (asynchronous job execution) the result cannot be displayed. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listRule: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of rules */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeRule: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary rule information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["RuleStore"]; + "application/x-www-form-urlencoded": components["schemas"]["RuleStore"]; + }; + }; + responses: { + /** @description New rule stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getRule: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the object. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested rule */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateRule: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the object. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated rule information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["RuleUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["RuleUpdate"]; + }; + }; + responses: { + /** @description Updated rule stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteRule: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the rule. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Rule deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + validateActionExpression: { + parameters: { + query: { + /** @description The action expression to validate. */ + expression: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The expression is valid. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example true */ + valid?: boolean; + }; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachmentBySubscription: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the subscription. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listRuleBySubscription: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the subscription. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of rules */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionBySubscription: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. */ + end?: string; + /** @description Optional filter on the transaction type(s) returned */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the subscription. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listSubscription: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. If it is are added to the request, Firefly III will calculate the appropriate payment and paid dates. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. If it is added to the request, Firefly III will calculate the appropriate payment and paid dates. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of subscriptions */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeSubscription: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary subscription information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["BillStore"]; + "application/x-www-form-urlencoded": components["schemas"]["BillStore"]; + }; + }; + responses: { + /** @description New subscription stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getSubscription: { + parameters: { + query?: { + /** @description A date formatted YYYY-MM-DD. If it is are added to the request, Firefly III will calculate the appropriate payment and paid dates. */ + start?: string; + /** @description A date formatted YYYY-MM-DD. If it is added to the request, Firefly III will calculate the appropriate payment and paid dates. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the subscription. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested subscription */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateSubscription: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the subscription. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array or key=value pairs with updated subscription information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["BillUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["BillUpdate"]; + }; + }; + responses: { + /** @description Updated subscription stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteSubscription: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the subscription. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Subscription deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachmentByTag: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description Either the tag itself or the tag ID. */ + tag: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByTag: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. This is the start date of the selected range (inclusive). */ + start?: string; + /** @description A date formatted YYYY-MM-DD. This is the end date of the selected range (inclusive). */ + end?: string; + /** @description Optional filter on the transaction type(s) returned. */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description Either the tag itself or the tag ID. */ + tag: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTag: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of tags */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TagArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeTag: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary tag information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["TagModelStore"]; + "application/x-www-form-urlencoded": components["schemas"]["TagModelStore"]; + }; + }; + responses: { + /** @description New tag stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TagSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getTag: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description Either the tag itself or the tag ID. If you use the tag itself, and it contains international (non-ASCII) characters, your mileage may vary. */ + tag: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested tag */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TagSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateTag: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description Either the tag itself or the tag ID. If you use the tag itself, and it contains international (non-ASCII) characters, your mileage may vary. */ + tag: string; + }; + cookie?: never; + }; + /** @description JSON array with updated tag information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["TagModelUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["TagModelUpdate"]; + }; + }; + responses: { + /** @description Updated tag stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TagSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteTag: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description Either the tag itself or the tag ID. If you use the tag itself, and it contains international (non-ASCII) characters, your mileage may vary. */ + tag: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Tag deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAccountByCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. When added to the request, Firefly III will show the account's balance on that day. */ + date?: string; + /** @description Optional filter on the account type(s) returned */ + type?: components["schemas"]["AccountTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of accounts */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AccountArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAvailableBudgetByCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of available budgets */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AvailableBudgetArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listBillByCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of bills. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BillArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listBudgetLimitByCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description Start date for the budget limit list. */ + start?: string; + /** @description End date for the budget limit list. */ + end?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of budget limits. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BudgetLimitArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listRecurrenceByCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of recurring transactions */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RecurrenceArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listRuleByCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of rules */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["RuleArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransactionByCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD, to limit the list of transactions. */ + start?: string; + /** @description A date formatted YYYY-MM-DD, to limit the list of transactions. */ + end?: string; + /** @description Optional filter on the transaction type(s) returned */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listExchangeRatesByCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of currency exchange rates. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyExchangeRateArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listCurrency: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of currencies. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencyArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary currency information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["CurrencyStore"]; + "application/x-www-form-urlencoded": components["schemas"]["CurrencyStore"]; + }; + }; + responses: { + /** @description New currency stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + enableCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Currency was enabled. */ + 204: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + disableCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Currency was disabled. */ + 204: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Currency cannot be disabled, because it is still in use. */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + primaryCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Currency has been made the primary currency. */ + 204: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested currency */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["CurrencySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + /** @description JSON array with updated currency information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/vnd.api+json": components["schemas"]["CurrencyUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["CurrencyUpdate"]; + }; + }; + responses: { + /** @description Updated currency stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CurrencySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The currency code. */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Currency deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getPrimaryCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The primary currency */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CurrencySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getDefaultCurrency: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The default currency */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CurrencySingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listLinksByJournal: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction journal / the split. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transaction links. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionLinkArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getTransactionByJournal: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction journal (split). */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested transaction. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteTransactionJournal: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction journal (the split) you wish to delete. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Transaction journal (split) deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listAttachmentByTransaction: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of attachments */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AttachmentArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listEventByTransaction: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of piggy bank events. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PiggyBankEventArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listTransaction: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description A date formatted YYYY-MM-DD. This is the start date of the selected range (inclusive). */ + start?: string; + /** @description A date formatted YYYY-MM-DD. This is the end date of the selected range (inclusive). */ + end?: string; + /** @description Optional filter on the transaction type(s) returned. */ + type?: components["schemas"]["TransactionTypeFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeTransaction: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary transaction information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["TransactionStore"]; + "application/x-www-form-urlencoded": components["schemas"]["TransactionStore"]; + }; + }; + responses: { + /** @description New transaction stored(s), result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getTransaction: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested transaction. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateTransaction: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated transaction information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["TransactionUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["TransactionUpdate"]; + }; + }; + responses: { + /** @description Updated transaction stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteTransaction: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the transaction. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Transaction deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listUserGroups: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of user groups. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["UserGroupArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getUserGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the user group. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested user group */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["UserGroupSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateUserGroup: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The ID of the account. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array or form-data with new user group information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["UserGroupUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["UserGroupUpdate"]; + }; + }; + responses: { + /** @description Updated user group is stored, result is in the response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["UserGroupSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + searchAccounts: { + parameters: { + query: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description The query you wish to search for. */ + query: string; + /** @description The type of accounts you wish to limit the search to. */ + type?: components["schemas"]["AccountTypeFilter"]; + /** @description The account field(s) you want to search in. */ + field: components["schemas"]["AccountSearchFieldFilter"]; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of accounts. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["AccountArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + searchTransactions: { + parameters: { + query: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + /** @description The query you wish to search for. */ + query: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["TransactionArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + countTransactions: { + parameters: { + query?: { + /** @description Count transactions with this exact external identifier. */ + external_identifier?: string; + /** @description Count transactions with this exact internal reference. */ + internal_reference?: string; + /** @description Count transactions whose notes contain this string. */ + notes?: string; + /** @description Count transactions with this exact description. */ + description?: string; + /** @description Whether to include soft-deleted transactions in the count. */ + include_deleted?: boolean; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The number of matching transactions. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example 42 */ + count?: number; + }; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getBasicSummary: { + parameters: { + query: { + /** @description A date formatted YYYY-MM-DD. */ + start: string; + /** @description A date formatted YYYY-MM-DD. */ + end: string; + /** @description A currency code like EUR or USD, to filter the result. */ + currency_code?: string; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description An array of sums. It depends on the user what you can expect to get back, so please try this out on the demo site. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["BasicSummary"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getAbout: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The available system information */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SystemInfo"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getCurrentUser: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The user */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["UserSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getReleaseNotes: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The version of the release notes to retrieve. Also possible is "v6.7.8" or "develop-2026-10-12". Notice the dash instead of the forward slash. */ + version: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The release notes for the specified version. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ReleaseNotes"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + finishBatch: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Empty response when the update was successful. A future improvement is to include the changed transactions. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getConfiguration: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description System configuration values */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/x-www-form-urlencoded": components["schemas"]["ConfigurationArray"]; + "application/json": components["schemas"]["ConfigurationArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getSingleConfiguration: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The name of the configuration value you want to know. */ + name: components["schemas"]["ConfigValueFilter"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description One system configuration value */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ConfigurationSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + setConfiguration: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The name of the configuration value you want to update. */ + name: components["schemas"]["ConfigValueUpdateFilter"]; + }; + cookie?: never; + }; + /** @description JSON array with the necessary account information or key=value pairs. See the model for the exact specifications. */ + requestBody: { + content: { + "application/x-www-form-urlencoded": components["schemas"]["ConfigurationUpdate"]; + "application/json": components["schemas"]["ConfigurationUpdate"]; + }; + }; + responses: { + /** @description New configuration value stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ConfigurationSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getCron: { + parameters: { + query?: { + /** + * @description A date formatted YYYY-MM-DD. This can be used to make the cron job pretend it's running + * on another day. + */ + date?: string; + /** + * @description Forces the cron job to fire, regardless of whether it has fired before. This may result + * in double transactions or weird budgets, so be careful. Only system owners can do this. + */ + force?: boolean; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The CLI token of any user in Firefly III, required to run the cron job. OR this is the `STATIC_CRON_TOKEN`. */ + cliToken: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The result of the cron job(s) firing. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["CronResult"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listUser: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of users. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["UserArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeUser: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary user information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["User"]; + "application/x-www-form-urlencoded": components["schemas"]["User"]; + }; + }; + responses: { + /** @description New user stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["UserSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getUser: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The user ID. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested user. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["UserSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateUser: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The user ID. */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated user information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["User"]; + "application/x-www-form-urlencoded": components["schemas"]["User"]; + }; + }; + responses: { + /** @description Updated user stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["UserSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteUser: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The user ID. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listPreference: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of preferences. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PreferenceArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storePreference: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array with the necessary preference information or key=value pairs. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["Preference"]; + "application/x-www-form-urlencoded": components["schemas"]["Preference"]; + }; + }; + responses: { + /** @description New account stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PreferenceSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getPreference: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The name of the preference. */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A single preference. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PreferenceSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updatePreference: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The name of the preference. Will always overwrite. Will be created if it does not exist. */ + name: string; + }; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary preference information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["PreferenceUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["PreferenceUpdate"]; + }; + }; + responses: { + /** @description Updated preference. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["PreferenceSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getWebhookMessages: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The webhook ID. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of webhook messages. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["WebhookMessageArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getSingleWebhookMessage: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The webhook ID. */ + id: string; + /** @description The webhook message ID. */ + messageId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A single webhook message. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["WebhookMessageSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteWebhookMessage: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The webhook ID. */ + id: string; + /** @description The webhook message ID. */ + messageId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Webhook message deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getWebhookMessageAttempts: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The webhook ID. */ + id: string; + /** @description The webhook message ID. */ + messageId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of webhook attempts. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["WebhookAttemptArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getSingleWebhookMessageAttempt: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The webhook ID. */ + id: string; + /** @description The webhook message ID. */ + messageId: number; + /** @description The webhook attempt ID. */ + attemptId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A single webhook attempt. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["WebhookAttemptSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteWebhookMessageAttempt: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The webhook ID. */ + id: string; + /** @description The webhook message ID. */ + messageId: number; + /** @description The webhook message attempt ID. */ + attemptId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Webhook message attempt deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + submitWebhook: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The webhook ID. */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK. */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description No messages to send, so did nothing. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + triggerTransactionWebhook: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** @description The webhook ID. */ + id: string; + /** @description The transaction ID. */ + transactionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Webhook triggered successfully. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + listWebhook: { + parameters: { + query?: { + /** @description Number of items per page. The default pagination is per 50 items. */ + limit?: number; + /** @description Page number. The default pagination is per 50 items. */ + page?: number; + }; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A list of webhooks. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["WebhookArray"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + storeWebhook: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description JSON array or key=value pairs with the necessary webhook information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["WebhookStore"]; + "application/x-www-form-urlencoded": components["schemas"]["WebhookStore"]; + }; + }; + responses: { + /** @description New webhook stored, result in response. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["WebhookSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + getWebhook: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** + * @description The webhook ID. + * @example 123 + */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description The requested webhook. */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["WebhookSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + updateWebhook: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** + * @description The webhook ID. + * @example 123 + */ + id: string; + }; + cookie?: never; + }; + /** @description JSON array with updated webhook information. See the model for the exact specifications. */ + requestBody: { + content: { + "application/json": components["schemas"]["WebhookUpdate"]; + "application/x-www-form-urlencoded": components["schemas"]["WebhookUpdate"]; + }; + }; + responses: { + /** @description Updated webhook stored, result in response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/vnd.api+json": components["schemas"]["WebhookSingle"]; + }; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Validation error. The body will have the exact details. */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ValidationErrorResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; + deleteWebhook: { + parameters: { + query?: never; + header?: { + /** + * @description Unique identifier associated with this request. + * @example 40c71bbb-c676-4f24-83cf-cc725d7d7a00 + */ + "X-Trace-Id"?: string; + }; + path: { + /** + * @description The webhook ID. + * @example 123 + */ + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Webhook deleted. */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BadRequestResponse"]; + }; + }; + /** @description Unauthenticated */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UnauthenticatedResponse"]; + }; + }; + /** @description Page not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["NotFoundResponse"]; + }; + }; + /** @description Internal exception */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["InternalExceptionResponse"]; + }; + }; + }; + }; +} diff --git a/src/lib/api/types.ts b/src/lib/api/types.ts new file mode 100644 index 0000000..1337b46 --- /dev/null +++ b/src/lib/api/types.ts @@ -0,0 +1,65 @@ +import type { components } from "./schema.js"; + +type S = components["schemas"]; + +export interface Item { + attributes: T; + id: string; + type: string; +} +export interface Page { + data: Item[]; + meta: { + pagination?: { + total: number; + count: number; + per_page: number; + current_page: number; + total_pages: number; + }; + }; +} +export interface One { + data: Item; +} + +export type Account = S["AccountProperties"]; +export type Attachment = S["AttachmentProperties"]; +export type AvailableBudget = S["AvailableBudgetProperties"]; +export type Bill = S["BillProperties"]; +export type Budget = S["BudgetProperties"]; +export type BudgetLimit = S["BudgetLimitProperties"]; +export type Category = S["CategoryProperties"]; +export type Currency = S["CurrencyProperties"]; +export type ExchangeRate = S["CurrencyExchangeProperties"]; +export type LinkType = S["LinkType"]; +export type ObjectGroup = S["ObjectGroup"]; +export type PiggyBank = S["PiggyBankProperties"]; +export type PiggyBankEvent = S["PiggyBankEventProperties"]; +export type Preference = S["Preference"]; +export type Recurrence = S["RecurrenceProperties"]; +export type Rule = S["Rule"]; +export type RuleGroup = S["RuleGroup"]; +export type Tag = S["TagModel"]; +export type TransactionGroup = S["Transaction"]; +export type Split = S["TransactionSplit"]; +export type SplitStore = S["TransactionSplitStore"]; +export type TransactionStore = S["TransactionStore"]; +export type TransactionLink = S["TransactionLink"]; +export type UserGroup = S["UserGroupReadAttributes"]; +export type Webhook = S["WebhookProperties"]; +export type ChartDataSet = S["ChartDataSet"]; +export type InsightGroupEntry = S["InsightGroupEntry"]; +export type InsightTotalEntry = S["InsightTotalEntry"]; +export type BasicSummary = S["BasicSummary"]; +export type BasicSummaryEntry = S["BasicSummaryEntry"]; +export type SystemInfo = S["SystemInfo"]; + +export type TransactionType = + | "withdrawal" + | "deposit" + | "transfer" + | "reconciliation" + | "opening balance"; + +export type AccountType = "asset" | "expense" | "revenue" | "liabilities"; diff --git a/src/lib/components/Amount.svelte b/src/lib/components/Amount.svelte new file mode 100644 index 0000000..67be7d9 --- /dev/null +++ b/src/lib/components/Amount.svelte @@ -0,0 +1,38 @@ + + +{formatMoney({ amount, code, decimals, symbol }, signed)} diff --git a/src/lib/components/Box.svelte b/src/lib/components/Box.svelte new file mode 100644 index 0000000..c027819 --- /dev/null +++ b/src/lib/components/Box.svelte @@ -0,0 +1,54 @@ + + +
+ {#if title || tools} +
+ {#if title} +

+ {#if href} + {title} + {:else} + {title} + {/if} +

+ {/if} + {#if tools} +
{@render tools()}
+ {/if} +
+ {/if} +
+ {@render children()} +
+ {#if footer} +
+ {@render footer()} +
+ {/if} +
diff --git a/src/lib/components/ConfirmButton.svelte b/src/lib/components/ConfirmButton.svelte new file mode 100644 index 0000000..de76d7a --- /dev/null +++ b/src/lib/components/ConfirmButton.svelte @@ -0,0 +1,61 @@ + + + diff --git a/src/lib/components/QuickEntry.svelte b/src/lib/components/QuickEntry.svelte new file mode 100644 index 0000000..b18fc40 --- /dev/null +++ b/src/lib/components/QuickEntry.svelte @@ -0,0 +1,9 @@ + + +
+ +
diff --git a/src/lib/components/shell/Cheatsheet.svelte b/src/lib/components/shell/Cheatsheet.svelte new file mode 100644 index 0000000..ccde6e1 --- /dev/null +++ b/src/lib/components/shell/Cheatsheet.svelte @@ -0,0 +1,69 @@ + + + event.target === dialog && (keys.sheetOpen = false)} + onclose={() => (keys.sheetOpen = false)} + onkeydown={(event) => event.key === "?" && (keys.sheetOpen = false)} + bind:this={dialog} +> +
+

Keyboard shortcuts

+ Every shortcut is also in the palette, + {prettyKeys("mod+k")[0]} +
+
+ {#each groups as [group, bindings] (group)} +
+

+ {group} +

+ {#each bindings as binding (binding.keys)} +
+ {binding.label} + + {#each prettyKeys(binding.keys) as key, i (i)} + {key} + {/each} + +
+ {/each} +
+ {/each} +
+
diff --git a/src/lib/components/shell/PageHeader.svelte b/src/lib/components/shell/PageHeader.svelte new file mode 100644 index 0000000..95021aa --- /dev/null +++ b/src/lib/components/shell/PageHeader.svelte @@ -0,0 +1,58 @@ + + + + {title} · Firefly III + + +
+
+

+ {title} +

+ {#if subtitle} + {subtitle} + {/if} +
+
+ {@render actions?.()} +
    +
  1. Home
  2. + {#each crumbs as crumb (crumb.label)} + +
  3. + {#if crumb.href} + {crumb.label} + {:else} + {crumb.label} + {/if} +
  4. + {/each} +
+
+
diff --git a/src/lib/components/shell/Palette.svelte b/src/lib/components/shell/Palette.svelte new file mode 100644 index 0000000..aaa28f5 --- /dev/null +++ b/src/lib/components/shell/Palette.svelte @@ -0,0 +1,291 @@ + + + (ui.palette = false)} + bind:this={dialog} +> +
+ + + Esc +
+
    + {#each results as entry, index (entry.id)} +
  • + +
  • + {:else} +
  • + Nothing matches. Try fewer letters. +
  • + {/each} +
+
diff --git a/src/lib/components/shell/PeriodPicker.svelte b/src/lib/components/shell/PeriodPicker.svelte new file mode 100644 index 0000000..515aac7 --- /dev/null +++ b/src/lib/components/shell/PeriodPicker.svelte @@ -0,0 +1,111 @@ + + +
+ + + + + {period.label} + + + +
+ {#each period.presets() as preset (preset.label)} + {@const current = + preset.range.start === period.start && + preset.range.end === period.end} + + {/each} +
+
+
+ + +
+ +
+
+
+
+ +
diff --git a/src/lib/components/shell/Shell.svelte b/src/lib/components/shell/Shell.svelte new file mode 100644 index 0000000..75c5e6c --- /dev/null +++ b/src/lib/components/shell/Shell.svelte @@ -0,0 +1,322 @@ + + +
+
+ + {#if ui.collapsed} + + FireflyIII + {:else} + FireflyIII + {/if} + + + +
+ + + + + + + + + + + {#each CREATE_LINKS as link (link.href)} + + link.old ? location.assign(link.href) : goto(link.href)} + > + {link.label} + + {/each} + + +
+
+ +
+ + {#if ui.mobileNav} + + {/if} + +
+ {#if ui.quickEntry && quick} + {@render quick()} + {/if} +
+ {@render children()} +
+
+ + Firefly III {session.version} + {#if session.drift} + · this interface was tested with {TESTED_VERSION}, some screens + may misbehave + {/if} + + Press ? for shortcuts, + Shift+O + for the old interface +
+
+
+
+ + + diff --git a/src/lib/components/shell/Sidebar.svelte b/src/lib/components/shell/Sidebar.svelte new file mode 100644 index 0000000..c75e5a1 --- /dev/null +++ b/src/lib/components/shell/Sidebar.svelte @@ -0,0 +1,150 @@ + + + diff --git a/src/lib/dates.ts b/src/lib/dates.ts new file mode 100644 index 0000000..092d029 --- /dev/null +++ b/src/lib/dates.ts @@ -0,0 +1,150 @@ +export interface Range { + end: string; + start: string; +} + +export type ViewRange = + | "1D" + | "1W" + | "last7" + | "1M" + | "last30" + | "MTD" + | "3M" + | "last90" + | "QTD" + | "6M" + | "1Y" + | "YTD" + | "last365"; + +const DYNAMIC = new Set([ + "last7", + "last30", + "last90", + "last365", + "MTD", + "QTD", + "YTD", +]); + +const pad = (n: number) => String(n).padStart(2, "0"); + +export const iso = (d: Date) => + `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; + +export function parse(value: string): Date { + const [y, m, d] = value.slice(0, 10).split("-").map(Number); + return new Date(y, m - 1, d); +} + +export const today = () => iso(new Date()); + +export function addDays(value: string, days: number): string { + const d = parse(value); + d.setDate(d.getDate() + days); + return iso(d); +} + +export function addMonths(value: string, months: number): string { + const d = parse(value); + const day = d.getDate(); + d.setDate(1); + d.setMonth(d.getMonth() + months); + const last = new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate(); + d.setDate(Math.min(day, last)); + return iso(d); +} + +export const isDynamic = (view: ViewRange) => DYNAMIC.has(view); + +function startOf(value: string, view: ViewRange): string { + const d = parse(value); + switch (view) { + case "1D": + return value; + case "1W": { + const shift = (d.getDay() + 6) % 7; + return addDays(value, -shift); + } + case "3M": + return iso( + new Date(d.getFullYear(), Math.floor(d.getMonth() / 3) * 3, 1) + ); + case "6M": + return iso(new Date(d.getFullYear(), d.getMonth() < 6 ? 0 : 6, 1)); + case "1Y": + return iso(new Date(d.getFullYear(), 0, 1)); + default: + return iso(new Date(d.getFullYear(), d.getMonth(), 1)); + } +} + +const LENGTH_MONTHS: Partial> = { + "1M": 1, + "1Y": 12, + "3M": 3, + "6M": 6, +}; + +export function periodOf(value: string, view: ViewRange): Range { + const now = today(); + switch (view) { + case "last7": + return { end: now, start: addDays(now, -7) }; + case "last30": + return { end: now, start: addDays(now, -30) }; + case "last90": + return { end: now, start: addDays(now, -90) }; + case "last365": + return { end: now, start: addDays(now, -365) }; + case "MTD": + return { end: now, start: startOf(now, "1M") }; + case "QTD": + return { end: now, start: startOf(now, "3M") }; + case "YTD": + return { end: now, start: startOf(now, "1Y") }; + case "1D": + return { end: value, start: value }; + case "1W": { + const start = startOf(value, "1W"); + return { end: addDays(start, 6), start }; + } + default: { + const start = startOf(value, view); + const months = LENGTH_MONTHS[view] ?? 1; + return { end: addDays(addMonths(start, months), -1), start }; + } + } +} + +export function shiftPeriod(range: Range, view: ViewRange, dir: 1 | -1): Range { + const fixed = isDynamic(view) ? "1M" : view; + const aligned = periodOf(range.start, fixed); + if (aligned.start === range.start && aligned.end === range.end) { + const anchor = dir === 1 ? addDays(range.end, 1) : addDays(range.start, -1); + return periodOf(anchor, fixed); + } + const days = daysBetween(range.start, range.end) + 1; + return { + end: addDays(range.end, dir * days), + start: addDays(range.start, dir * days), + }; +} + +export function daysBetween(a: string, b: string): number { + return Math.round((parse(b).getTime() - parse(a).getTime()) / 86_400_000); +} + +export function eachDay(range: Range): string[] { + const days: string[] = []; + for (let d = range.start; d <= range.end; d = addDays(d, 1)) { + days.push(d); + } + return days; +} + +export function contains(range: Range, value: string): boolean { + const day = value.slice(0, 10); + return day >= range.start && day <= range.end; +} diff --git a/src/lib/format.ts b/src/lib/format.ts new file mode 100644 index 0000000..9485993 --- /dev/null +++ b/src/lib/format.ts @@ -0,0 +1,143 @@ +export interface Money { + amount: string | number | null | undefined; + code?: string | null; + decimals?: number | null; + symbol?: string | null; +} + +const settings: { anonymous: boolean; locale: string } = { + anonymous: false, + locale: "en-GB", +}; + +export function configureFormat(locale: string, anonymous: boolean) { + settings.locale = locale; + settings.anonymous = anonymous; +} + +export const currentLocale = () => settings.locale; + +const numberFormats = new Map(); + +function numberFormat(decimals: number, signed: boolean): Intl.NumberFormat { + const key = `${settings.locale}|${decimals}|${signed}`; + let format = numberFormats.get(key); + if (!format) { + format = new Intl.NumberFormat(settings.locale, { + maximumFractionDigits: decimals, + minimumFractionDigits: decimals, + signDisplay: signed ? "exceptZero" : "auto", + }); + numberFormats.set(key, format); + } + return format; +} + +export function toNumber(value: string | number | null | undefined): number { + if (value === null || value === undefined || value === "") { + return 0; + } + return typeof value === "number" ? value : Number.parseFloat(value); +} + +export function formatNumber( + value: string | number | null | undefined, + decimals = 2, + signed = false +): string { + if (settings.anonymous) { + return numberFormat(decimals, false).format(0); + } + return numberFormat(decimals, signed).format(toNumber(value)); +} + +export function formatMoney(money: Money, signed = false): string { + const number = formatNumber(money.amount, money.decimals ?? 2, signed); + const symbol = money.symbol ?? money.code ?? ""; + return symbol ? `${symbol}${number}` : number; +} + +export function compactMoney(value: number, symbol = ""): string { + if (settings.anonymous) { + return `${symbol}0`; + } + const format = new Intl.NumberFormat(settings.locale, { + maximumFractionDigits: 1, + notation: "compact", + }); + return `${symbol}${format.format(value)}`; +} + +const dateFormats = new Map(); + +function dateFormat(options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat { + const key = `${settings.locale}|${JSON.stringify(options)}`; + let format = dateFormats.get(key); + if (!format) { + format = new Intl.DateTimeFormat(settings.locale, options); + dateFormats.set(key, format); + } + return format; +} + +function toDate(value: string | Date): Date { + if (value instanceof Date) { + return value; + } + if (value.length === 10) { + const [y, m, d] = value.split("-").map(Number); + return new Date(y, m - 1, d); + } + return new Date(value); +} + +export function formatDate( + value: string | Date | null | undefined, + style: "short" | "medium" | "long" | "day" | "month" | "year" = "medium" +): string { + if (!value) { + return ""; + } + const date = toDate(value); + switch (style) { + case "short": + return dateFormat({ day: "2-digit", month: "short" }).format(date); + case "day": + return dateFormat({ + day: "numeric", + month: "short", + weekday: "short", + }).format(date); + case "month": + return dateFormat({ month: "long", year: "numeric" }).format(date); + case "year": + return dateFormat({ year: "numeric" }).format(date); + case "long": + return dateFormat({ dateStyle: "long" }).format(date); + default: + return dateFormat({ dateStyle: "medium" }).format(date); + } +} + +export function formatDateTime(value: string | null | undefined): string { + if (!value) { + return ""; + } + return dateFormat({ dateStyle: "medium", timeStyle: "short" }).format( + new Date(value) + ); +} + +export function formatRange(start: string, end: string): string { + return dateFormat({ dateStyle: "medium" }).formatRange( + toDate(start), + toDate(end) + ); +} + +export function percent(value: number, digits = 0): string { + return new Intl.NumberFormat(settings.locale, { + maximumFractionDigits: digits, + style: "percent", + }).format(value); +} diff --git a/src/lib/fuzzy.ts b/src/lib/fuzzy.ts new file mode 100644 index 0000000..14aa6c3 --- /dev/null +++ b/src/lib/fuzzy.ts @@ -0,0 +1,47 @@ +const SEPARATOR = /[\s/·-]/; + +export function fuzzyScore(query: string, text: string): number { + const q = query.toLowerCase().trim(); + if (!q) { + return 1; + } + const t = text.toLowerCase(); + const direct = t.indexOf(q); + if (direct !== -1) { + const wordStart = direct === 0 || SEPARATOR.test(t[direct - 1]); + return 1000 - direct + (wordStart ? 200 : 0) - t.length * 0.1; + } + let score = 0; + let position = -1; + let streak = 0; + for (const char of q) { + if (char === " ") { + continue; + } + const next = t.indexOf(char, position + 1); + if (next === -1) { + return 0; + } + streak = next === position + 1 ? streak + 1 : 0; + score += 10 + streak * 5 - (next - position) * 0.5; + position = next; + } + return Math.max(score, 1); +} + +export function fuzzyFilter( + items: T[], + query: string, + text: (item: T) => string, + limit = 50 +): T[] { + if (!query.trim()) { + return items.slice(0, limit); + } + return items + .map((item) => ({ item, score: fuzzyScore(query, text(item)) })) + .filter((entry) => entry.score > 0) + .sort((a, b) => b.score - a.score) + .slice(0, limit) + .map((entry) => entry.item); +} diff --git a/src/lib/keys.svelte.ts b/src/lib/keys.svelte.ts new file mode 100644 index 0000000..47fc4b9 --- /dev/null +++ b/src/lib/keys.svelte.ts @@ -0,0 +1,125 @@ +export interface Binding { + group?: string; + hidden?: boolean; + input?: boolean; + keys: string; + label: string; + run: (event: KeyboardEvent) => void; +} + +const SEQUENCE_MS = 1200; +const EDITABLE = + "input, textarea, select, [contenteditable=''], [contenteditable='true']"; + +function token(event: KeyboardEvent): string { + const parts: string[] = []; + if (event.ctrlKey || event.metaKey) { + parts.push("mod"); + } + if (event.altKey) { + parts.push("alt"); + } + const key = event.key === " " ? "Space" : event.key; + if (event.shiftKey && key.length > 1) { + parts.push("shift"); + } + parts.push(key.length === 1 && parts.length > 0 ? key.toLowerCase() : key); + return parts.join("+"); +} + +export function isEditable(target: EventTarget | null): boolean { + return target instanceof Element && target.closest(EDITABLE) !== null; +} + +class Keys { + layers = $state([]); + pending = $state(""); + sheetOpen = $state(false); + private timer: ReturnType | undefined; + + all = $derived(this.layers.flat()); + + register(bindings: Binding[]): () => void { + const layer = bindings; + this.layers = [...this.layers, layer]; + return () => { + this.layers = this.layers.filter((l) => l !== layer); + }; + } + + private find(combo: string, editable: boolean): Binding | undefined { + for (let i = this.layers.length - 1; i >= 0; i -= 1) { + const match = this.layers[i].find( + (b) => b.keys === combo && (!editable || b.input) + ); + if (match) { + return match; + } + } + } + + private isPrefix(combo: string): boolean { + return this.all.some((b) => b.keys.startsWith(`${combo} `)); + } + + private clear() { + this.pending = ""; + clearTimeout(this.timer); + } + + handle = (event: KeyboardEvent) => { + if (event.defaultPrevented || event.isComposing) { + return; + } + if (["Shift", "Control", "Meta", "Alt"].includes(event.key)) { + return; + } + const editable = isEditable(event.target); + const current = token(event); + const combo = this.pending ? `${this.pending} ${current}` : current; + const binding = + this.find(combo, editable) ?? + (this.pending ? this.find(current, editable) : undefined); + if (binding) { + event.preventDefault(); + this.clear(); + binding.run(event); + return; + } + if (!editable && this.isPrefix(current)) { + event.preventDefault(); + this.clear(); + this.pending = current; + this.timer = setTimeout(() => this.clear(), SEQUENCE_MS); + return; + } + this.clear(); + }; +} + +export const keys = new Keys(); + +export function useKeys(bindings: () => Binding[]) { + $effect(() => keys.register(bindings())); +} + +const APPLE = /Mac|iPhone|iPad/; +const PC_NAMES: Record = { + alt: "Alt", + Enter: "↵", + Escape: "Esc", + mod: "Ctrl", + shift: "Shift", +}; +const MAC_NAMES: Record = { ...PC_NAMES, alt: "⌥", mod: "⌘" }; + +export function prettyKeys(combo: string): string[] { + const mac = + typeof navigator !== "undefined" && APPLE.test(navigator.platform); + return combo.split(" ").map((part) => + part + .split("+") + .map((piece) => (mac ? MAC_NAMES : PC_NAMES)[piece] ?? piece) + .join(mac ? "" : "+") + ); +} diff --git a/src/lib/list-nav.svelte.ts b/src/lib/list-nav.svelte.ts new file mode 100644 index 0000000..c174a3b --- /dev/null +++ b/src/lib/list-nav.svelte.ts @@ -0,0 +1,255 @@ +import { type Binding, useKeys } from "#lib/keys.svelte.js"; + +interface Options { + edit?: (item: T) => void; + extra?: () => Binding[]; + id?: string; + items: () => T[]; + key: (item: T) => string; + open?: (item: T) => void; + selectable?: boolean; +} + +export class ListNav { + cursor = $state(-1); + selected = $state>(new Set()); + anchor = -1; + private readonly options: Options; + + constructor(options: Options) { + this.options = options; + } + + get items() { + return this.options.items(); + } + + get current(): T | undefined { + return this.items[this.cursor]; + } + + get selection(): T[] { + return this.items.filter((item) => + this.selected.has(this.options.key(item)) + ); + } + + get targets(): T[] { + if (this.selected.size > 0) { + return this.selection; + } + return this.current ? [this.current] : []; + } + + rowId(index: number) { + return `${this.options.id ?? "list"}-row-${index}`; + } + + isSelected(item: T) { + return this.selected.has(this.options.key(item)); + } + + move(to: number) { + const count = this.items.length; + if (count === 0) { + this.cursor = -1; + return; + } + this.cursor = Math.max(0, Math.min(count - 1, to)); + document + .getElementById(this.rowId(this.cursor)) + ?.scrollIntoView({ block: "nearest" }); + } + + toggle(item: T | undefined = this.current) { + if (!item) { + return; + } + const key = this.options.key(item); + const next = new Set(this.selected); + if (next.has(key)) { + next.delete(key); + } else { + next.add(key); + } + this.selected = next; + this.anchor = this.items.indexOf(item); + } + + extend(delta: number) { + if (this.cursor < 0) { + this.move(0); + } + const next = new Set(this.selected); + if (this.current) { + next.add(this.options.key(this.current)); + } + this.move(this.cursor + delta); + if (this.current) { + next.add(this.options.key(this.current)); + } + this.selected = next; + } + + selectRange(index: number) { + const from = this.anchor < 0 ? index : this.anchor; + const [a, b] = from < index ? [from, index] : [index, from]; + const next = new Set(this.selected); + for (const item of this.items.slice(a, b + 1)) { + next.add(this.options.key(item)); + } + this.selected = next; + } + + selectAll() { + const allSelected = this.selected.size === this.items.length; + this.selected = allSelected + ? new Set() + : new Set(this.items.map((item) => this.options.key(item))); + } + + clear() { + this.selected = new Set(); + } + + click(index: number, event: MouseEvent) { + this.cursor = index; + if (!this.options.selectable) { + return; + } + if (event.shiftKey) { + this.selectRange(index); + } else if (event.metaKey || event.ctrlKey) { + this.toggle(this.items[index]); + } + } + + bindings(): Binding[] { + const list: Binding[] = [ + { + group: "List", + keys: "j", + label: "Next row", + run: () => this.move(this.cursor + 1), + }, + { + group: "List", + keys: "k", + label: "Previous row", + run: () => this.move(this.cursor - 1), + }, + { + group: "List", + hidden: true, + keys: "ArrowDown", + label: "Next row", + run: () => this.move(this.cursor + 1), + }, + { + group: "List", + hidden: true, + keys: "ArrowUp", + label: "Previous row", + run: () => this.move(this.cursor - 1), + }, + { + group: "List", + keys: "g g", + label: "First row", + run: () => this.move(0), + }, + { + group: "List", + keys: "G", + label: "Last row", + run: () => this.move(this.items.length - 1), + }, + { + group: "List", + hidden: true, + keys: "mod+d", + label: "Half page down", + run: () => this.move(this.cursor + 15), + }, + { + group: "List", + hidden: true, + keys: "mod+u", + label: "Half page up", + run: () => this.move(this.cursor - 15), + }, + ]; + const { open, edit, selectable } = this.options; + if (open) { + list.push( + { + group: "List", + keys: "Enter", + label: "Open row", + run: () => this.current && open(this.current), + }, + { + group: "List", + hidden: true, + keys: "o", + label: "Open row", + run: () => this.current && open(this.current), + } + ); + } + if (edit) { + list.push({ + group: "List", + keys: "e", + label: "Edit row", + run: () => this.current && edit(this.current), + }); + } + if (selectable) { + list.push( + { + group: "Selection", + keys: "x", + label: "Select row", + run: () => this.toggle(), + }, + { + group: "Selection", + hidden: true, + keys: "Space", + label: "Select row", + run: () => this.toggle(), + }, + { + group: "Selection", + keys: "J", + label: "Extend selection down", + run: () => this.extend(1), + }, + { + group: "Selection", + keys: "K", + label: "Extend selection up", + run: () => this.extend(-1), + }, + { + group: "Selection", + keys: "*", + label: "Select all / none", + run: () => this.selectAll(), + }, + { + group: "Selection", + keys: "u", + label: "Clear selection", + run: () => this.clear(), + } + ); + } + return [...list, ...(this.options.extra?.() ?? [])]; + } + + use() { + useKeys(() => this.bindings()); + } +} diff --git a/src/lib/nav.ts b/src/lib/nav.ts new file mode 100644 index 0000000..56e3f9f --- /dev/null +++ b/src/lib/nav.ts @@ -0,0 +1,197 @@ +import ArrowLeftRight from "@lucide/svelte/icons/arrow-left-right"; +import CalendarClock from "@lucide/svelte/icons/calendar-clock"; +import ChartColumn from "@lucide/svelte/icons/chart-column"; +import ChartPie from "@lucide/svelte/icons/chart-pie"; +import Cpu from "@lucide/svelte/icons/cpu"; +import CreditCard from "@lucide/svelte/icons/credit-card"; +import LayoutDashboard from "@lucide/svelte/icons/layout-dashboard"; +import PiggyBank from "@lucide/svelte/icons/piggy-bank"; +import SlidersHorizontal from "@lucide/svelte/icons/sliders-horizontal"; +import Tags from "@lucide/svelte/icons/tags"; +import Upload from "@lucide/svelte/icons/upload"; +import type { Component } from "svelte"; + +export interface NavLink { + href: string; + keys?: string; + label: string; + match?: string[]; + old?: boolean; +} + +export type NavItem = NavLink & { + icon: Component; + children?: NavLink[]; +}; + +export interface NavSection { + items: NavItem[]; + title?: string; +} + +export const NAV: NavSection[] = [ + { + items: [ + { + href: "/", + icon: LayoutDashboard, + keys: "g d", + label: "Dashboard", + match: ["/", "/home"], + }, + ], + }, + { + items: [ + { href: "/budgets", icon: ChartPie, keys: "g b", label: "Budgets" }, + { + href: "/subscriptions", + icon: CalendarClock, + keys: "g s", + label: "Subscriptions", + match: ["/subscriptions", "/bills"], + }, + { + href: "/piggy-banks", + icon: PiggyBank, + keys: "g p", + label: "Piggy banks", + }, + ], + title: "Financial control", + }, + { + items: [ + { + children: [ + { + href: "/transactions/all", + keys: "g t", + label: "All transactions", + }, + { + href: "/transactions/withdrawal", + keys: "g w", + label: "Expenses", + }, + { + href: "/transactions/deposit", + keys: "g i", + label: "Revenue / income", + }, + { + href: "/transactions/transfers", + keys: "g x", + label: "Transfers", + match: ["/transactions/transfers", "/transactions/transfer"], + }, + ], + href: "/transactions/all", + icon: ArrowLeftRight, + label: "Transactions", + match: ["/transactions"], + }, + { + children: [ + { href: "/rules", label: "Rules", match: ["/rules", "/rule-groups"] }, + { href: "/recurring", label: "Recurring transactions" }, + { href: "/webhooks/index", label: "Webhooks", match: ["/webhooks"] }, + ], + href: "/rules", + icon: Cpu, + label: "Automation", + match: ["/rules", "/rule-groups", "/recurring", "/webhooks"], + }, + ], + title: "Accounting", + }, + { + items: [ + { + children: [ + { href: "/accounts/asset", keys: "g a", label: "Asset accounts" }, + { href: "/accounts/expense", keys: "g e", label: "Expense accounts" }, + { href: "/accounts/revenue", keys: "g v", label: "Revenue accounts" }, + { href: "/accounts/liabilities", keys: "g l", label: "Liabilities" }, + ], + href: "/accounts/asset", + icon: CreditCard, + label: "Accounts", + match: ["/accounts", "/inactive-accounts"], + }, + { + children: [ + { href: "/categories", keys: "g c", label: "Categories" }, + { href: "/tags", keys: "g m", label: "Tags" }, + { href: "/groups", keys: "g o", label: "Groups" }, + ], + href: "/categories", + icon: Tags, + label: "Classification", + match: ["/categories", "/tags", "/groups"], + }, + { href: "/reports", icon: ChartColumn, keys: "g r", label: "Reports" }, + { href: "/export", icon: Upload, label: "Export data" }, + { + children: [ + { href: "/profile", label: "Profile", old: true }, + { + href: "/profile/oauth", + label: "Remote access and tokens", + old: true, + }, + { href: "/preferences", keys: "g ,", label: "Preferences" }, + { href: "/currencies", label: "Currencies" }, + { href: "/exchange-rates", label: "Exchange rates" }, + { href: "/administrations", label: "Financial administrations" }, + { href: "/settings", label: "System settings", old: true }, + ], + href: "/preferences", + icon: SlidersHorizontal, + label: "Options", + match: [ + "/profile", + "/preferences", + "/currencies", + "/exchange-rates", + "/administrations", + "/settings", + ], + }, + ], + title: "Others", + }, +]; + +export const CREATE_LINKS: NavLink[] = [ + { href: "/transactions/create/withdrawal", label: "New withdrawal" }, + { href: "/transactions/create/deposit", label: "New deposit" }, + { href: "/transactions/create/transfer", label: "New transfer" }, + { href: "/accounts/create/asset", label: "New asset account" }, + { href: "/accounts/create/expense", label: "New expense account" }, + { href: "/accounts/create/revenue", label: "New revenue account" }, + { href: "/accounts/create/liabilities", label: "New liability" }, + { href: "/budgets/create", label: "New budget" }, + { href: "/categories/create", label: "New category" }, + { href: "/piggy-banks/create", label: "New piggy bank" }, + { href: "/subscriptions/create", label: "New subscription" }, + { href: "/rules/create", label: "New rule", old: true }, + { href: "/recurring/create", label: "New recurring transaction", old: true }, +]; + +export function allLinks(): NavLink[] { + return NAV.flatMap((section) => + section.items.flatMap((item) => + item.children ? item.children : [item as NavLink] + ) + ); +} + +export function isActive(link: NavLink, pathname: string): boolean { + const prefixes = link.match ?? [link.href]; + return prefixes.some((prefix) => + prefix === "/" + ? pathname === "/" + : pathname === prefix || pathname.startsWith(`${prefix}/`) + ); +} diff --git a/src/lib/period.svelte.ts b/src/lib/period.svelte.ts new file mode 100644 index 0000000..569aa96 --- /dev/null +++ b/src/lib/period.svelte.ts @@ -0,0 +1,130 @@ +import { + addDays, + isDynamic, + periodOf, + type Range, + shiftPeriod, + today, + type ViewRange, +} from "#lib/dates.js"; +import { formatDate, formatRange } from "#lib/format.js"; + +const STORAGE_KEY = "ffui.period"; +const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/; + +export interface Preset { + label: string; + range: Range; +} + +function stored(): Range | null { + try { + const value = JSON.parse(localStorage.getItem(STORAGE_KEY) ?? "null"); + return ISO_DATE.test(value?.start) && ISO_DATE.test(value?.end) + ? value + : null; + } catch { + return null; + } +} + +export function rangeFromUrl(url: { + searchParams: { get: (name: string) => string | null }; +}): Range | null { + const start = url.searchParams.get("start") ?? ""; + const end = url.searchParams.get("end") ?? ""; + return ISO_DATE.test(start) && ISO_DATE.test(end) && start <= end + ? { end, start } + : null; +} + +export function periodLabel(range: Range, view: ViewRange): string { + const aligned = periodOf(range.start, isDynamic(view) ? "1M" : view); + if (aligned.start === range.start && aligned.end === range.end) { + if (view === "1M" || isDynamic(view)) { + return formatDate(range.start, "month"); + } + if (view === "1Y") { + return formatDate(range.start, "year"); + } + } + return formatRange(range.start, range.end); +} + +class Period { + view = $state("1M"); + start = $state(today()); + end = $state(today()); + first = $state(null); + ready = $state(false); + + range = $derived({ end: this.end, start: this.start }); + label = $derived(periodLabel(this.range, this.view)); + isCurrent = $derived(this.start <= today() && today() <= this.end); + + init(view: ViewRange, url: Parameters[0]) { + this.view = view; + const range = rangeFromUrl(url) ?? stored() ?? periodOf(today(), view); + this.start = range.start; + this.end = range.end; + this.ready = true; + } + + set(range: Range) { + if (range.start === this.start && range.end === this.end) { + return; + } + this.start = range.start; + this.end = range.end; + localStorage.setItem(STORAGE_KEY, JSON.stringify(range)); + } + + shift(dir: 1 | -1) { + this.set(shiftPeriod(this.range, this.view, dir)); + } + + reset() { + this.set(periodOf(today(), this.view)); + } + + presets(): Preset[] { + const now = today(); + const { view } = this; + const presets: Preset[] = []; + if (!isDynamic(view)) { + const prev = shiftPeriod(this.range, view, -1); + const next = shiftPeriod(this.range, view, 1); + presets.push({ label: periodLabel(prev, view), range: prev }); + presets.push({ label: periodLabel(next, view), range: next }); + } + const current = periodOf(now, view); + presets.push({ + label: `Today (${periodLabel(current, view)})`, + range: current, + }); + presets.push({ + label: "Last seven days", + range: { end: now, start: addDays(now, -7) }, + }); + presets.push({ + label: "Last thirty days", + range: { end: now, start: addDays(now, -30) }, + }); + presets.push({ label: "Month to date", range: periodOf(now, "MTD") }); + presets.push({ label: "Year to date", range: periodOf(now, "YTD") }); + const year = Number(now.slice(0, 4)) - 1; + presets.push({ + label: `Previous year (${year})`, + range: { end: `${year}-12-31`, start: `${year}-01-01` }, + }); + if (this.first) { + presets.push({ + label: "Everything", + range: { end: now, start: this.first }, + }); + } + return presets; + } +} + +export const period = new Period(); diff --git a/src/lib/session.svelte.ts b/src/lib/session.svelte.ts new file mode 100644 index 0000000..b79ee11 --- /dev/null +++ b/src/lib/session.svelte.ts @@ -0,0 +1,122 @@ +import { + api, + keepAlive, + leaveTo, + ping, + takeReturnPath, +} from "#lib/api/client.js"; +import type { + Currency, + Item, + Page, + Preference, + SystemInfo, +} from "#lib/api/types.js"; +import type { ViewRange } from "#lib/dates.js"; +import { configureFormat } from "#lib/format.js"; + +export const TESTED_VERSION = "6.7.9"; + +type About = SystemInfo; +interface User { + data: { attributes: { email: string } }; +} + +function toLocale(locale: unknown, language: unknown): string { + const raw = locale && locale !== "equal" ? locale : language; + return typeof raw === "string" && raw ? raw.replace("_", "-") : "en-GB"; +} + +const VERSION_PREFIX = /^v/; +const VERSION_SPLIT = /[.-]/; + +const versionParts = (value: string) => + value.replace(VERSION_PREFIX, "").split(VERSION_SPLIT).map(Number); + +export function newer(a: string, b: string): boolean { + const pa = versionParts(a); + const pb = versionParts(b); + for (let i = 0; i < Math.max(pa.length, pb.length); i += 1) { + const diff = (pa[i] || 0) - (pb[i] || 0); + if (diff !== 0) { + return diff > 0; + } + } + return false; +} + +class Session { + ready = $state(false); + failed = $state(""); + version = $state(""); + apiVersion = $state(""); + email = $state(""); + prefs = $state>({}); + currencies = $state[]>([]); + + locale = $derived(toLocale(this.prefs.locale, this.prefs.language)); + viewRange = $derived((this.prefs.viewRange as ViewRange) ?? "1M"); + pageSize = $derived(Number(this.prefs.listPageSize) || 50); + anonymous = $derived(this.prefs.anonymous === true); + frontpageAccounts = $derived( + ((this.prefs.frontpageAccounts ?? []) as (number | string)[]).map(String) + ); + primary = $derived( + this.currencies.find((c) => c.attributes.primary)?.attributes ?? + this.currencies[0]?.attributes + ); + drift = $derived( + this.apiVersion !== "" && newer(this.apiVersion, TESTED_VERSION) + ); + + async loadPreferences() { + const page = await api>("/v1/preferences", { + query: { limit: 500 }, + }); + const prefs: Record = {}; + for (const item of page.data) { + prefs[item.attributes.name] = item.attributes.data; + } + this.prefs = prefs; + configureFormat(this.locale, this.anonymous); + } + + async loadCurrencies() { + const page = await api>("/v1/currencies", { + query: { limit: 500 }, + }); + this.currencies = page.data; + } + + async setPreference(name: string, data: unknown) { + const exists = name in this.prefs; + await api(exists ? `/v1/preferences/${name}` : "/v1/preferences", { + body: exists ? { data } : { data, name }, + method: exists ? "PUT" : "POST", + }); + this.prefs = { ...this.prefs, [name]: data }; + configureFormat(this.locale, this.anonymous); + } + + async boot(): Promise { + const state = await ping(); + if (state !== "ok") { + leaveTo(state); + return null; + } + const [about, user] = await Promise.all([ + api("/v1/about"), + api("/v1/about/user"), + this.loadPreferences(), + this.loadCurrencies(), + ]); + this.version = about.data?.version ?? ""; + this.apiVersion = about.data?.api_version ?? ""; + this.email = user.data.attributes.email; + this.ready = true; + keepAlive(); + return takeReturnPath(); + } +} + +export const session = new Session(); diff --git a/src/lib/spa-paths.ts b/src/lib/spa-paths.ts new file mode 100644 index 0000000..e998979 --- /dev/null +++ b/src/lib/spa-paths.ts @@ -0,0 +1,75 @@ +export const SPA_EXACT = [ + "/", + "/home", + "/accounts", + "/budgets", + "/categories", + "/tags", + "/bills", + "/subscriptions", + "/piggy-banks", + "/groups", + "/reports", + "/search", + "/currencies", + "/exchange-rates", + "/attachments", + "/preferences", + "/export", + "/administrations", + "/recurring", + "/webhooks/index", + "/settings/links", +]; + +export const SPA_PREFIXES = [ + "/accounts/", + "/inactive-accounts/", + "/transactions/", + "/budgets/", + "/categories/", + "/tags/", + "/bills/", + "/subscriptions/", + "/piggy-banks/", + "/groups/", + "/reports/", + "/currencies/", + "/exchange-rates/", + "/attachments/", + "/administrations/", + "/recurring/show/", + "/webhooks/show/", + "/settings/links/show/", +]; + +export const FIREFLY_PREFIXES = [ + "/accounts/reconcile/", + "/attachments/download/", + "/attachments/view/", + "/transactions/convert/", + "/transactions/debug/", + "/transactions/link/", + "/transactions/mass/", + "/transactions/bulk/", + "/transactions/show-by-journal/", + "/piggy-banks/add/", + "/piggy-banks/remove/", + "/reports/options/", +]; + +export function isSpaPath(pathname: string): boolean { + if (FIREFLY_PREFIXES.some((prefix) => pathname.startsWith(prefix))) { + return false; + } + return ( + SPA_EXACT.includes(pathname) || + SPA_PREFIXES.some((prefix) => pathname.startsWith(prefix)) + ); +} + +export function oldUiUrl(href: string, sticky = false): string { + const target = new URL(href); + target.searchParams.set("ffui", sticky ? "off" : "old"); + return target.pathname + target.search + target.hash; +} diff --git a/src/lib/ui.svelte.ts b/src/lib/ui.svelte.ts new file mode 100644 index 0000000..86e9275 --- /dev/null +++ b/src/lib/ui.svelte.ts @@ -0,0 +1,28 @@ +const SIDEBAR_KEY = "ffui.sidebar.collapsed"; + +class Ui { + palette = $state(false); + paletteQuery = $state(""); + quickEntry = $state(false); + mobileNav = $state(false); + collapsed = $state( + typeof localStorage !== "undefined" && + localStorage.getItem(SIDEBAR_KEY) === "1" + ); + + openPalette(query = "") { + this.paletteQuery = query; + this.palette = true; + } + + toggleSidebar() { + if (window.matchMedia("(max-width: 1023px)").matches) { + this.mobileNav = !this.mobileNav; + return; + } + this.collapsed = !this.collapsed; + localStorage.setItem(SIDEBAR_KEY, this.collapsed ? "1" : "0"); + } +} + +export const ui = new Ui(); diff --git a/src/params.ts b/src/params.ts new file mode 100644 index 0000000..0df4372 --- /dev/null +++ b/src/params.ts @@ -0,0 +1,19 @@ +import { defineParams } from "@sveltejs/kit/params"; + +const ISO_DATE = /^\d{4}-\d{2}-\d{2}$/; +const ID = /^\d+$/; +const ACCOUNT_TYPES = new Set(["asset", "expense", "revenue", "liabilities"]); +const TRANSACTION_TYPES = new Set([ + "withdrawal", + "deposit", + "transfers", + "transfer", + "all", +]); + +export const params = defineParams({ + accounttype: (value) => (ACCOUNT_TYPES.has(value) ? value : undefined), + date: (value) => (ISO_DATE.test(value) ? value : undefined), + id: (value) => (ID.test(value) ? value : undefined), + txtype: (value) => (TRANSACTION_TYPES.has(value) ? value : undefined), +}); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index c7742e0..5040734 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,10 +1,93 @@ + -{@render children()} + + {#if session.ready} + + {@render children()} + {#snippet quick()} + + {/snippet} + + {:else if session.failed} +
+
+

Firefly III did not answer

+

{session.failed}

+

+ Try again + Log in + Open the old interface +

+
+
+ {:else} +
+ Connecting to Firefly III +
+ {/if} +
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 85a2c65..2b16241 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,13 +1,5 @@ - - Firefly UI - + -
-

Firefly UI

-

- Edit - src/routes/+page.svelte. -

-
+ diff --git a/src/routes/home/+page.ts b/src/routes/home/+page.ts new file mode 100644 index 0000000..80eac4b --- /dev/null +++ b/src/routes/home/+page.ts @@ -0,0 +1,5 @@ +import { redirect } from "@sveltejs/kit"; + +export function load() { + redirect(307, "/"); +} diff --git a/src/routes/layout.css b/src/routes/layout.css index 061750a..b3905ad 100644 --- a/src/routes/layout.css +++ b/src/routes/layout.css @@ -5,11 +5,111 @@ @import "./claddcn.css"; @custom-variant dark (&:is(.dark *)); +:root { + --ff-brand: oklch(0.57 0.105 240); + --ff-brand-deep: oklch(0.5 0.1 240); + --ff-on-brand: oklch(0.99 0.01 240); + --ff-income: oklch(0.5 0.12 145); + --ff-expense: oklch(0.52 0.15 28); + --ff-transfer: oklch(0.5 0.085 225); + --ff-warn: oklch(0.62 0.14 70); + --ff-row-hover: oklch(0.96 0.012 240); + --ff-row-cursor: oklch(0.93 0.03 240); + --ff-row-selected: oklch(0.9 0.05 240); + --ff-series-1: oklch(0.57 0.105 240); + --ff-series-2: oklch(0.62 0.13 160); + --ff-series-3: oklch(0.7 0.14 70); + --ff-series-4: oklch(0.58 0.15 20); + --ff-series-5: oklch(0.55 0.12 300); + --ff-series-6: oklch(0.65 0.1 200); + --ff-series-7: oklch(0.6 0.13 110); + --ff-series-8: oklch(0.6 0.08 260); +} + +.cladd-color-brand { + --cladd-theme: #3c8dbc; +} + +.dark { + --ff-brand: oklch(0.42 0.085 240); + --ff-brand-deep: oklch(0.36 0.075 240); + --ff-on-brand: oklch(0.97 0.01 240); + --ff-income: oklch(0.78 0.15 140); + --ff-expense: oklch(0.76 0.1 35); + --ff-transfer: oklch(0.76 0.08 220); + --ff-warn: oklch(0.8 0.13 80); + --ff-row-hover: oklch(0.25 0.012 240); + --ff-row-cursor: oklch(0.29 0.03 240); + --ff-row-selected: oklch(0.33 0.06 240); + --ff-series-1: oklch(0.7 0.1 240); + --ff-series-2: oklch(0.72 0.12 160); + --ff-series-3: oklch(0.8 0.13 75); + --ff-series-4: oklch(0.7 0.13 25); + --ff-series-5: oklch(0.7 0.11 300); + --ff-series-6: oklch(0.75 0.09 200); + --ff-series-7: oklch(0.75 0.12 115); + --ff-series-8: oklch(0.72 0.07 260); +} + +@theme inline { + --color-brand: var(--ff-brand); + --color-brand-deep: var(--ff-brand-deep); + --color-on-brand: var(--ff-on-brand); + --color-income: var(--ff-income); + --color-expense: var(--ff-expense); + --color-transfer: var(--ff-transfer); + --color-warn: var(--ff-warn); + --color-row-hover: var(--ff-row-hover); + --color-row-cursor: var(--ff-row-cursor); + --color-row-selected: var(--ff-row-selected); +} + @layer base { * { @apply border-border outline-ring/50; } + html { + scrollbar-color: var(--cladd-fg-softest) transparent; + } body { + font-size: 13px; + line-height: 1.45; @apply bg-background text-foreground; } + ::selection { + background: color-mix(in oklch, var(--ff-brand) 28%, transparent); + } + :focus-visible { + outline: 1.5px solid var(--ff-brand); + outline-offset: 1px; + } + .dark :focus-visible { + outline-color: var(--ff-series-1); + } + a { + text-underline-offset: 3px; + } +} + +@utility num { + font-family: var(--font-mono); + font-variant-numeric: tabular-nums; + letter-spacing: -0.01em; + white-space: nowrap; +} + +@utility kbd { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 1.35rem; + height: 1.25rem; + padding: 0 0.3rem; + font-family: var(--font-mono); + font-size: 11px; + line-height: 1; + color: var(--cladd-fg-soft); + background: var(--cladd-surface-cut); + border-radius: 4px; + box-shadow: inset 0 -1px 0 var(--cladd-outline); } diff --git a/stand/docker-compose.yml b/stand/docker-compose.yml new file mode 100644 index 0000000..220344e --- /dev/null +++ b/stand/docker-compose.yml @@ -0,0 +1,44 @@ +name: ffui-stand + +x-firefly-env: &firefly-env + APP_ENV: local + APP_DEBUG: "false" + SITE_OWNER: stand@ffui.local + DB_CONNECTION: sqlite + TZ: Europe/Warsaw + TRUSTED_PROXIES: "**" + DEFAULT_LANGUAGE: en_US + DEFAULT_LOCALE: en_GB + STATIC_CRON_TOKEN: ffuistandcronffuistandcron123456 + +services: + v1: + image: fireflyiii/core:version-6.6.6 + environment: + <<: *firefly-env + APP_KEY: ffuistandv1ffuistandv1ffuistand1 + APP_URL: http://localhost:${FFUI_V1_PORT:-30072} + FIREFLY_III_LAYOUT: v1 + volumes: + - v1_db:/var/www/html/storage/database + - v1_upload:/var/www/html/storage/upload + ports: + - "127.0.0.1:${FFUI_V1_PORT:-30072}:8080" + + v3: + image: fireflyiii/core:latest + environment: + <<: *firefly-env + APP_KEY: ffuistandv3ffuistandv3ffuistand3 + APP_URL: http://localhost:${FFUI_V3_PORT:-40869} + volumes: + - v3_db:/var/www/html/storage/database + - v3_upload:/var/www/html/storage/upload + ports: + - "127.0.0.1:${FFUI_V3_PORT:-40869}:8080" + +volumes: + v1_db: + v1_upload: + v3_db: + v3_upload: diff --git a/vite.config.ts b/vite.config.ts index c48e008..b25d8c9 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,33 +2,49 @@ import adapter from "@sveltejs/adapter-static"; import { sveltekit } from "@sveltejs/kit/vite"; import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; import tailwindcss from "@tailwindcss/vite"; -import { defineConfig } from "vite"; +import { defineConfig, loadEnv } from "vite"; +import { isSpaPath } from "./src/lib/spa-paths"; const allowedHosts = process.env.ALLOWED_HOSTS ? process.env.ALLOWED_HOSTS.split(",") : undefined; -export default defineConfig({ - plugins: [ - tailwindcss(), - sveltekit({ - adapter: adapter({ - assets: "build", - fallback: "index.html", - pages: "build", - precompress: false, - strict: false, +const VITE_OWNED = "^/(?!@|src/|node_modules/|\\.svelte-kit/|__|_app/|favicon)"; + +export default defineConfig(({ mode }) => { + const env = { ...loadEnv(mode, process.cwd(), ""), ...process.env }; + const firefly = env.FIREFLY_URL ?? "http://127.0.0.1:8080"; + return { + plugins: [ + tailwindcss(), + sveltekit({ + adapter: adapter({ + assets: "build", + fallback: "index.html", + pages: "build", + precompress: false, + strict: false, + }), + preprocess: [vitePreprocess()], }), - preprocess: [vitePreprocess()], - }), - ], - server: { - allowedHosts, - proxy: { - "/api": { - changeOrigin: true, - target: process.env.API_PROXY_TARGET ?? "http://localhost:8080", + ], + server: { + allowedHosts, + proxy: { + [VITE_OWNED]: { + bypass(req) { + const url = new URL(req.url ?? "/", "http://dev.local"); + const ffui = url.searchParams.get("ffui"); + const read = req.method === "GET" || req.method === "HEAD"; + const old = ffui === "old" || ffui === "off"; + return read && !old && isSpaPath(url.pathname) + ? req.url + : undefined; + }, + target: firefly, + xfwd: true, + }, }, }, - }, + }; });