openapi: 3.2.0 info: title: 'FlipperForce Public Project Expenses: Line Items API' version: 0.0.10 description: '# FlipperForce Public API • Version 1 ## How do I request an API key? 1. [Request a Public API key.](https://tools.flipperforce.com/integrations) 2. Use the API key as an Authorization HTTP header with Bearer token: `Authorization: Bearer token-goes-here` ## Support / Help * Email: support@flipperforce.com * Chat: https://tools.flipperforce.com/ ## Rate Limits If you encounter a `429 Too Many Requests` response, you have submitted too many requests in a short amount of time. Please decrease the amount or frequency of your requests and try again. ## Changelog ### July 25, 2026 - v0.0.10 * Add support for [Activity Log](/operations/v1.workspace.activity-log.list). ### July 23, 2026 - v0.0.9 * Response format of `created_at` and `updated_at` fields now include microseconds. Old format: `2026-06-14T15:30:45Z` and new format: `2026-06-14T15:30:45.123456Z` ### July 21, 2026 - v0.0.8 * OpenAPI spec documents Bearer Token authentication strategy ### June 22, 2026 - v0.0.6 * Add support for [Project Income](/operations/v1.project.income.list). * [Create Upload Intent](/operations/v1.workspace.upload-intent.create) properly documents API response code as 201 Created instead of 200 OK. ### June 21, 2026 - v0.0.4 * Add support for [Project Expenses: Transactions](/operations/v1.project.expense-transactions.list). * Add support for [Project Expenses: Line Items](/operations/v1.project.expense-line-items.list). ### June 4, 2026 - v0.0.3 * Add support for [Project Expenses: Categories](/operations/v1.project.expense-categories.list). ### June 2, 2026 - v0.0.2 * Add support for [Expense Accounts](/operations/v1.workspace.expense-accounts.list). * Add support for [Companies](/operations/v1.workspace.companies.list). * Add support for [Company Categories](/operations/v1.workspace.companies.categories.list). ### September 3, 2025 - v0.0.1 * [Project Photo Log: Photos - Create](/operations/v1.project.photo-log.create) added support for ordering Photos by EXIF timestamp via parameter `photo_timestamp`. ### August 13, 2025 * [Create Upload Intent API](/operations/v1.workspace.upload-intent.create) now requires a new POST parameter `upload_type` noting the uploaded file''s use case. ' servers: - url: https://tools.flipperforce.com/api/v1 security: - PublicApiBearerAuth: [] tags: - name: 'Project Expenses: Line Items' paths: /project/{projectV1}/expense-line-items/list: get: operationId: v1.project.expense-line-items.list description: "List Expense line items within a Project.\n\nExpense Line Items are the individual charges within an Expense Transaction, such as the items purchased and listed on a receipt.\n\n## Reporting on Total Amounts\n\nSee the `data.totals` property in the response for the sum total of various Expense Line Item fields (before pagination).\n\n* `data.totals.amount` - Sum of all `amount` values for all matching Expenses (excludes tax)\n* `data.totals.tax` - Sum of all `tax` values for all matching Expenses\n* `data.totals.total` - Sum of all `total` values for all matching Expenses (amount + tax)\n\nThe total number of records matching the query parameters is in `meta.total_count`.\n\n## Filter by date range\n\n Supports limiting to date ranges by using a combination of these operators:\n\n * date[gt] - greater than\n * date[gte] - greater than or equal to\n * date[lt] - less than\n * date[lte] - less than or equal to\n\n## Example: Find Expenses for a specific Date\n\n```text\nGET /api/v1/project/{projectV1}/expense-line-items/list?date=2025-09-15\n```\n\n## Example: Year-to-Date Totals\n\nRequest Expenses using a year-to-date range, then read the returned totals.\n\nFor example, Expenses year-to-date through June 19, 2026.\n\n* date[gte]=2026-01-01\n* date[lte]=2026-06-19\n\n```text\nGET /api/v1/project/{projectV1}/expense-line-items/list?date[gte]=2026-01-01&date[lte]=2026-06-19\n```\n\nExample response body excerpt:\n\n```json\n{\n \"data\": {\n \"totals\": {\n \"amount\": 475.25,\n \"tax\": 40.14,\n \"total\": 515.39\n },\n \"expenses\": [\n {\n \"uuid\": \"9d0e1f23-4567-489a-bcde-f0123456789a\",\n \"created_at\": \"2026-06-19T15:30:00.000000Z\",\n \"updated_at\": \"2026-06-19T15:30:00.000000Z\",\n \"transaction_uuid\": \"8c9d0e1f-2345-4567-89ab-cdef01234567\",\n \"date\": \"2026-06-19\",\n \"invoice_number\": \"HD-4213\",\n \"name\": \"Architectural roof shingles\",\n \"class\": \"material\",\n \"amount\": 475.25,\n \"tax\": 40.14,\n \"total\": 515.39,\n \"expense_account\": {\n \"uuid\": \"1c2d3e4f-5a6b-4c7d-8e9f-0123456789ab\",\n \"name\": \"Visa 4213\"\n },\n \"company\": {\n \"uuid\": \"2d3e4f5a-6b7c-4d8e-9f01-123456789abc\",\n \"name\": \"The Home Depot\"\n },\n \"expense_category\": {\n \"uuid\": \"3e4f5a6b-7c8d-4e9f-8012-23456789abcd\",\n \"name\": \"Roofing\"\n }\n }\n ]\n }\n}\n```\n\n## Example: Per Company Totals\n\nUse the [Companies List API](/operations/v1.workspace.companies.list) to find the UUID of the Company you want, then provide the UUID with filter `company_uuids[]`.\n\nThen read the response field `data.totals` to find the total.\n\n```text\nGET /api/v1/project/{projectV1}/expense-line-items/list?company_uuids[]=2d3e4f5a-6b7c-4d8e-9f01-123456789abc\n```\n\nExample response body excerpt:\n\n```json\n{\n \"data\": {\n \"totals\": {\n \"amount\": 475.25,\n \"tax\": 40.14,\n \"total\": 515.39\n },\n \"expenses\": [\n {\n \"uuid\": \"9d0e1f23-4567-489a-bcde-f0123456789a\",\n \"created_at\": \"2026-06-19T15:30:00.000000Z\",\n \"updated_at\": \"2026-06-19T15:30:00.000000Z\",\n \"transaction_uuid\": \"8c9d0e1f-2345-4567-89ab-cdef01234567\",\n \"date\": \"2026-06-19\",\n \"invoice_number\": \"HD-4213\",\n \"name\": \"Architectural roof shingles\",\n \"class\": \"material\",\n \"amount\": 475.25,\n \"tax\": 40.14,\n \"total\": 515.39,\n \"expense_account\": {\n \"uuid\": \"1c2d3e4f-5a6b-4c7d-8e9f-0123456789ab\",\n \"name\": \"Visa 4213\"\n },\n \"company\": {\n \"uuid\": \"2d3e4f5a-6b7c-4d8e-9f01-123456789abc\",\n \"name\": \"The Home Depot\"\n },\n \"expense_category\": {\n \"uuid\": \"3e4f5a6b-7c8d-4e9f-8012-23456789abcd\",\n \"name\": \"Roofing\"\n }\n }\n ]\n }\n}\n```\n\n## Example: Per Expense Category Totals\n\nUse the [Project Expenses: Categories List API](/operations/v1.project.expense-categories.list) to find the UUID of the Category you want, then provide the UUID with filter `expense_category_uuids[]`.\n\nThen read the response field `data.totals` to find the total.\n\n```text\nGET /api/v1/project/{projectV1}/expense-line-items/list?expense_category_uuids[]=3e4f5a6b-7c8d-4e9f-8012-23456789abcd\n```\n\nExample response body excerpt:\n\n```json\n{\n \"data\": {\n \"totals\": {\n \"amount\": 475.25,\n \"tax\": 40.14,\n \"total\": 515.39\n },\n \"expenses\": [\n {\n \"uuid\": \"9d0e1f23-4567-489a-bcde-f0123456789a\",\n \"created_at\": \"2026-06-19T15:30:00.000000Z\",\n \"updated_at\": \"2026-06-19T15:30:00.000000Z\",\n \"transaction_uuid\": \"8c9d0e1f-2345-4567-89ab-cdef01234567\",\n \"date\": \"2026-06-19\",\n \"invoice_number\": \"HD-4213\",\n \"name\": \"Architectural roof shingles\",\n \"class\": \"material\",\n \"amount\": 475.25,\n \"tax\": 40.14,\n \"total\": 515.39,\n \"expense_account\": {\n \"uuid\": \"1c2d3e4f-5a6b-4c7d-8e9f-0123456789ab\",\n \"name\": \"Visa 4213\"\n },\n \"company\": {\n \"uuid\": \"2d3e4f5a-6b7c-4d8e-9f01-123456789abc\",\n \"name\": \"The Home Depot\"\n },\n \"expense_category\": {\n \"uuid\": \"3e4f5a6b-7c8d-4e9f-8012-23456789abcd\",\n \"name\": \"Roofing\"\n }\n }\n ]\n }\n}\n```\n\n## Example: Per Expense Account Totals\n\nUse the [Expense Accounts List API](/operations/v1.workspace.expense-accounts.list) to find the UUID of the Account you want, then provide the UUID with filter `expense_account_uuids[]`.\n\nThen read the response field `data.totals` to find the total.\n\n```text\nGET /api/v1/project/{projectV1}/expense-line-items/list?expense_account_uuids[]=1c2d3e4f-5a6b-4c7d-8e9f-0123456789ab\n```\n\nExample response body excerpt:\n\n```json\n{\n \"data\": {\n \"totals\": {\n \"amount\": 475.25,\n \"tax\": 40.14,\n \"total\": 515.39\n },\n \"expenses\": [\n {\n \"uuid\": \"9d0e1f23-4567-489a-bcde-f0123456789a\",\n \"created_at\": \"2026-06-19T15:30:00.000000Z\",\n \"updated_at\": \"2026-06-19T15:30:00.000000Z\",\n \"transaction_uuid\": \"8c9d0e1f-2345-4567-89ab-cdef01234567\",\n \"date\": \"2026-06-19\",\n \"invoice_number\": \"HD-4213\",\n \"name\": \"Architectural roof shingles\",\n \"class\": \"material\",\n \"amount\": 475.25,\n \"tax\": 40.14,\n \"total\": 515.39,\n \"expense_account\": {\n \"uuid\": \"1c2d3e4f-5a6b-4c7d-8e9f-0123456789ab\",\n \"name\": \"Visa 4213\"\n },\n \"company\": {\n \"uuid\": \"2d3e4f5a-6b7c-4d8e-9f01-123456789abc\",\n \"name\": \"The Home Depot\"\n },\n \"expense_category\": {\n \"uuid\": \"3e4f5a6b-7c8d-4e9f-8012-23456789abcd\",\n \"name\": \"Roofing\"\n }\n }\n ]\n }\n}\n```\n\n## Example: Expenses missing certain data\n\nThe API supports flags for returning Expenses without certain data:\n\n* Company: `has_company=false`\n* Expense Account: `has_expense_account=false`\n* Expense Category: `has_expense_category=false`\n* Class: `has_class=false`\n\nFor example, use `has_expense_account=false` to find Expenses without an Expense Account set:\n\n```text\nGET /api/v1/project/{projectV1}/expense-line-items/list?has_expense_account=false\n```\n\nExample response body excerpt:\n\n```json\n{\n \"data\": {\n \"totals\": {\n \"amount\": 125.75,\n \"tax\": 10.56,\n \"total\": 136.31\n },\n \"expenses\": [\n {\n \"uuid\": \"0e1f2345-6789-4abc-9def-0123456789ab\",\n \"created_at\": \"2025-12-31T15:35:00.000000Z\",\n \"updated_at\": \"2025-12-31T15:35:00.000000Z\",\n \"transaction_uuid\": \"8c9d0e1f-2345-4567-89ab-cdef01234567\",\n \"date\": \"2025-12-31\",\n \"invoice_number\": null,\n \"name\": \"Unassigned roofing receipt\",\n \"class\": \"other\",\n \"amount\": 125.75,\n \"tax\": 10.56,\n \"total\": 136.31,\n \"expense_account\": null,\n \"company\": null,\n \"expense_category\": null\n }\n ]\n }\n}\n```" summary: List tags: - 'Project Expenses: Line Items' parameters: - name: per_page in: query description: Number of records to return at a time. schema: type: integer default: 20 minimum: 1 maximum: 100 - name: date in: query description: Expense date in `YYYY-MM-DD` format for exact matching. Supports date ranges via by using operators like `date[gt]` (greater than), `date[gte]` (greater than or equal to), `date[lt]` (less than), and `date[lte]` (less than or equal to). schema: type: string - name: company_uuids[] in: query description: Company UUID assigned to Expenses. Pass repeated values like `company_uuids[]=uuid-a&company_uuids[]=uuid-b`. schema: type: array items: type: string - name: expense_account_uuids[] in: query description: Expense Account UUID assigned to Expenses. Pass repeated values like `expense_account_uuids[]=uuid-a&expense_account_uuids[]=uuid-b`. schema: type: array items: type: string - name: expense_category_uuids[] in: query description: Expense Category UUID assigned to Expenses. Pass repeated values like `expense_category_uuids[]=uuid-a&expense_category_uuids[]=uuid-b`. schema: type: array items: type: string - name: classes[] in: query description: 'Expense Class. Allowed values: `labor`, `material`, `labor-and-material`, `other`.' schema: type: array items: type: string - name: has_company in: query description: Whether to return only Expenses with or without an assigned Company. schema: type: boolean - name: has_expense_account in: query description: Whether to return only Expenses with or without an assigned Expense Account. schema: type: boolean - name: has_expense_category in: query description: Whether to return only Expenses with or without an assigned Expense Category. schema: type: boolean - name: has_class in: query description: Whether to return only Expenses with or without an assigned Class. schema: type: boolean - name: cursor in: query schema: type: string - name: projectV1 in: path required: true description: Project UUID schema: type: string format: uuid - name: date[gt] in: query description: 'Return Expense Line Items after this date, excluding the given date. Format: `YYYY-MM-DD`.' schema: type: string format: YYYY-MM-DD - name: date[gte] in: query description: 'Return Expense Line Items on or after this date. Format: `YYYY-MM-DD`.' schema: type: string format: YYYY-MM-DD - name: date[lt] in: query description: 'Return Expense Line Items before this date, excluding the given date. Format: `YYYY-MM-DD`.' schema: type: string format: YYYY-MM-DD - name: date[lte] in: query description: 'Return Expense Line Items on or before this date. Format: `YYYY-MM-DD`.' schema: type: string format: YYYY-MM-DD responses: '200': description: Paginated set of `Expense Line Item` content: application/json: schema: type: object properties: data: $ref: '#/components/schemas/Expense_Line_Item_List' links: type: object properties: first: type: - string - 'null' last: type: - string - 'null' prev: type: - string - 'null' next: type: - string - 'null' required: - first - last - prev - next meta: type: object properties: path: type: - string - 'null' description: Base path for paginator generated URLs. per_page: type: integer description: Number of items shown per page. minimum: 0 next_cursor: type: - string - 'null' description: The "cursor" that points to the next set of items. prev_cursor: type: - string - 'null' description: The "cursor" that points to the previous set of items. total_count: type: integer description: Number of records matching the request filters before pagination. required: - path - per_page - next_cursor - prev_cursor - total_count required: - data - links - meta '401': $ref: '#/components/responses/AuthenticationException' '422': $ref: '#/components/responses/ValidationException' '403': description: When the authenticated User Account is forbidden from accessing the content or software features content: application/json: schema: type: object properties: message: type: string description: Human-readable description of why access was not allowed reason: type: - string - 'null' description: 'Machine-readable code for why access was not allowed. Possible values: * `UNKNOWN` - Access Forbidden * `UNSUPPORTED_CLIENT` - Unsupported client. * `SUBSCRIPTION_MISSING` - A Subscription is required. Visit the application website to manage the Subscription. * `SUBSCRIPTION_PAYMENT_DUE` - A paid Subscription is required. Visit the application website to manage the Subscription. * `SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE` - The Subscription Plan does not support using this Software Feature. * `FEATURE_ACCESS_DENIED` - Your account within this Workspace is not allowed to use this Software Feature. Contact the Workspace Owner to request access. * `PROJECT_ACCESS_DENIED` - Your account is not allowed to access this Project. Contact the Workspace Owner to request access. * `PROJECT_ARCHIVED` - This Project is Archived and cannot be accessed. You must restore this Project to Active Status to use it. * `WORKSPACE_ACCESS_DENIED` - You do not have an account within this Workspace. * `WORKSPACE_SELECTION_MISSING` - You must select a Workspace before making this request. ' enum: - UNKNOWN - UNSUPPORTED_CLIENT - SUBSCRIPTION_MISSING - SUBSCRIPTION_PAYMENT_DUE - SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE - FEATURE_ACCESS_DENIED - PROJECT_ACCESS_DENIED - PROJECT_ARCHIVED - WORKSPACE_ACCESS_DENIED - WORKSPACE_SELECTION_MISSING - null /project/{projectV1}/expense-line-items/{expenseUuid}: get: operationId: v1.project.expense-line-items.show description: Retrieve a single Expense line item. summary: Show tags: - 'Project Expenses: Line Items' parameters: - name: projectV1 in: path required: true description: Project UUID schema: type: string format: uuid - name: expenseUuid in: path required: true description: Expense UUID schema: type: string format: uuid responses: '200': description: '`Expense Line Item`' content: application/json: schema: type: object properties: data: $ref: '#/components/schemas/Expense_Line_Item' required: - data '401': $ref: '#/components/responses/AuthenticationException' '403': description: When the authenticated User Account is forbidden from accessing the content or software features content: application/json: schema: type: object properties: message: type: string description: Human-readable description of why access was not allowed reason: type: - string - 'null' description: 'Machine-readable code for why access was not allowed. Possible values: * `UNKNOWN` - Access Forbidden * `UNSUPPORTED_CLIENT` - Unsupported client. * `SUBSCRIPTION_MISSING` - A Subscription is required. Visit the application website to manage the Subscription. * `SUBSCRIPTION_PAYMENT_DUE` - A paid Subscription is required. Visit the application website to manage the Subscription. * `SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE` - The Subscription Plan does not support using this Software Feature. * `FEATURE_ACCESS_DENIED` - Your account within this Workspace is not allowed to use this Software Feature. Contact the Workspace Owner to request access. * `PROJECT_ACCESS_DENIED` - Your account is not allowed to access this Project. Contact the Workspace Owner to request access. * `PROJECT_ARCHIVED` - This Project is Archived and cannot be accessed. You must restore this Project to Active Status to use it. * `WORKSPACE_ACCESS_DENIED` - You do not have an account within this Workspace. * `WORKSPACE_SELECTION_MISSING` - You must select a Workspace before making this request. ' enum: - UNKNOWN - UNSUPPORTED_CLIENT - SUBSCRIPTION_MISSING - SUBSCRIPTION_PAYMENT_DUE - SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE - FEATURE_ACCESS_DENIED - PROJECT_ACCESS_DENIED - PROJECT_ARCHIVED - WORKSPACE_ACCESS_DENIED - WORKSPACE_SELECTION_MISSING - null patch: operationId: v1.project.expense-line-items.update description: Update a single Expense line item and return the parent Expense Transaction. summary: Update tags: - 'Project Expenses: Line Items' parameters: - name: projectV1 in: path required: true description: Project UUID schema: type: string format: uuid - name: expenseUuid in: path required: true description: Expense UUID schema: type: string format: uuid requestBody: content: application/json: schema: $ref: '#/components/schemas/Update_Expense_Line_Item_Request' responses: '200': description: '`Expense Transaction`' content: application/json: schema: type: object properties: data: $ref: '#/components/schemas/Expense_Transaction' required: - data '401': $ref: '#/components/responses/AuthenticationException' '422': $ref: '#/components/responses/ValidationException' '403': description: When the authenticated User Account is forbidden from accessing the content or software features content: application/json: schema: type: object properties: message: type: string description: Human-readable description of why access was not allowed reason: type: - string - 'null' description: 'Machine-readable code for why access was not allowed. Possible values: * `UNKNOWN` - Access Forbidden * `UNSUPPORTED_CLIENT` - Unsupported client. * `SUBSCRIPTION_MISSING` - A Subscription is required. Visit the application website to manage the Subscription. * `SUBSCRIPTION_PAYMENT_DUE` - A paid Subscription is required. Visit the application website to manage the Subscription. * `SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE` - The Subscription Plan does not support using this Software Feature. * `FEATURE_ACCESS_DENIED` - Your account within this Workspace is not allowed to use this Software Feature. Contact the Workspace Owner to request access. * `PROJECT_ACCESS_DENIED` - Your account is not allowed to access this Project. Contact the Workspace Owner to request access. * `PROJECT_ARCHIVED` - This Project is Archived and cannot be accessed. You must restore this Project to Active Status to use it. * `WORKSPACE_ACCESS_DENIED` - You do not have an account within this Workspace. * `WORKSPACE_SELECTION_MISSING` - You must select a Workspace before making this request. ' enum: - UNKNOWN - UNSUPPORTED_CLIENT - SUBSCRIPTION_MISSING - SUBSCRIPTION_PAYMENT_DUE - SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE - FEATURE_ACCESS_DENIED - PROJECT_ACCESS_DENIED - PROJECT_ARCHIVED - WORKSPACE_ACCESS_DENIED - WORKSPACE_SELECTION_MISSING - null delete: operationId: v1.project.expense-line-items.delete description: 'Delete a single Expense line item and return the parent Expense Transaction. If the deleted Expense was the Expense Transaction''s final line item and the Expense Transaction has no Receipt, the Expense Transaction is also deleted and a tombstone response is returned.' summary: Delete tags: - 'Project Expenses: Line Items' parameters: - name: projectV1 in: path required: true description: Project UUID schema: type: string format: uuid - name: expenseUuid in: path required: true description: Expense UUID schema: type: string format: uuid responses: '200': description: '`Expense Transaction` `Expense Line Item Delete Tombstone`' content: application/json: schema: anyOf: - type: object properties: data: $ref: '#/components/schemas/Expense_Transaction' required: - data - type: object properties: data: $ref: '#/components/schemas/Expense_Line_Item_Delete_Tombstone' required: - data '401': $ref: '#/components/responses/AuthenticationException' '403': description: When the authenticated User Account is forbidden from accessing the content or software features content: application/json: schema: type: object properties: message: type: string description: Human-readable description of why access was not allowed reason: type: - string - 'null' description: 'Machine-readable code for why access was not allowed. Possible values: * `UNKNOWN` - Access Forbidden * `UNSUPPORTED_CLIENT` - Unsupported client. * `SUBSCRIPTION_MISSING` - A Subscription is required. Visit the application website to manage the Subscription. * `SUBSCRIPTION_PAYMENT_DUE` - A paid Subscription is required. Visit the application website to manage the Subscription. * `SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE` - The Subscription Plan does not support using this Software Feature. * `FEATURE_ACCESS_DENIED` - Your account within this Workspace is not allowed to use this Software Feature. Contact the Workspace Owner to request access. * `PROJECT_ACCESS_DENIED` - Your account is not allowed to access this Project. Contact the Workspace Owner to request access. * `PROJECT_ARCHIVED` - This Project is Archived and cannot be accessed. You must restore this Project to Active Status to use it. * `WORKSPACE_ACCESS_DENIED` - You do not have an account within this Workspace. * `WORKSPACE_SELECTION_MISSING` - You must select a Workspace before making this request. ' enum: - UNKNOWN - UNSUPPORTED_CLIENT - SUBSCRIPTION_MISSING - SUBSCRIPTION_PAYMENT_DUE - SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE - FEATURE_ACCESS_DENIED - PROJECT_ACCESS_DENIED - PROJECT_ARCHIVED - WORKSPACE_ACCESS_DENIED - WORKSPACE_SELECTION_MISSING - null components: responses: ValidationException: description: Validation error content: application/json: schema: type: object properties: message: type: string description: Errors overview. errors: type: object description: A detailed description of each field that failed validation. additionalProperties: type: array items: type: string required: - message - errors AuthenticationException: description: Unauthenticated content: application/json: schema: type: object properties: message: type: string description: Error overview. required: - message schemas: Expense_Line_Item_Delete_Tombstone: type: object properties: deleted_transaction_uuid: type: string description: UUID of the Expense Transaction deleted because its final Expense was deleted. deleted_expense_uuid: type: string description: UUID of the final Expense deleted from the Transaction. message: type: string description: Human-readable explanation for why the parent Expense Transaction was deleted. required: - deleted_transaction_uuid - deleted_expense_uuid - message title: Expense Line Item Delete Tombstone Update_Expense_Line_Item_Request: type: object properties: total_tax: type: - number - 'null' description: Total tax for the parent Transaction. When omitted, current Transaction tax is preserved and redistributed. date: type: - string - 'null' description: Date this Expense was incurred in `YYYY-MM-DD` format. invoice_number: type: - string - 'null' description: Invoice number entered for this Expense. expense_account_uuid: type: - string - 'null' description: Expense Account UUID assigned to this Expense. company_uuid: type: - string - 'null' description: Company/vendor UUID assigned to this Expense. expense_category_uuid: type: - string - 'null' description: Expense Category UUID assigned to this Expense. name: type: string description: Description of the purchased item or service. Omit the field to leave the name unchanged, but when present must contain a name. class: type: - string - 'null' description: Expense classification. amount: type: - number - 'null' description: Expense amount BEFORE tax, in dollars. Such as `1234.56` title: Update Expense Line Item Request Expense_Transaction: type: object properties: uuid: type: string description: Public identifier. created_at: type: - string - 'null' description: 'Timestamp when Expense Transaction was created in ISO 8601 Zulu format with microseconds. Example: `2026-06-07T16:20:00.123456Z`' updated_at: type: - string - 'null' description: 'Timestamp when Expense Transaction was last changed in ISO 8601 Zulu format with microseconds. Example: `2026-06-07T16:20:00.123456Z`' sequence_number: type: - integer - 'null' description: Project-scoped sequence number shown in the web app as `T#`. receipt_uuid: type: - string - 'null' description: Receipt UUID associated with this Expense Transaction. subtotal: type: number description: Sum of Expense amounts before tax, in dollars. Such as `1234.56` total_tax: type: number description: Sum of tax values from all Expenses, in dollars. Such as `1234.56` grand_total: type: number description: Sum of Expense totals including tax, in dollars. Such as `1234.56` expenses: type: array description: Expense line items belonging to this Expense Transaction. items: $ref: '#/components/schemas/Expense_Line_Item' required: - uuid - created_at - updated_at - sequence_number - receipt_uuid - subtotal - total_tax - grand_total - expenses title: Expense Transaction Expense_Line_Item_List: type: object properties: totals: type: object description: Sums across all Expense Line Items matching the request filters, before pagination. properties: amount: type: number tax: type: number total: type: number required: - amount - tax - total expenses: type: array description: Current page of Expense Line Items. items: $ref: '#/components/schemas/Expense_Line_Item' required: - totals - expenses title: Expense Line Item List Expense_Line_Item: type: object properties: uuid: type: string description: Public identifier. created_at: type: - string - 'null' description: 'Timestamp when Expense was created in ISO 8601 Zulu format with microseconds. Example: `2026-06-07T16:20:00.123456Z`' updated_at: type: - string - 'null' description: 'Timestamp when Expense was last changed in ISO 8601 Zulu format with microseconds. Example: `2026-06-07T16:20:00.123456Z`' transaction_uuid: type: - string - 'null' description: Parent Expense Transaction public identifier. date: type: - string - 'null' description: Date this Expense was incurred in `YYYY-MM-DD` format. invoice_number: type: - string - 'null' description: Invoice number entered for this Expense. name: type: string description: Description of the purchased item or service. class: type: - string - 'null' description: 'Expense classification. One of: `labor`, `material`, `labor-and-material`, `other`.' amount: type: - number - 'null' description: Expense amount BEFORE tax, in dollars. Such as `1234.56` tax: type: - number - 'null' description: Tax allocated to this Expense, in dollars. Such as `1234.56`. This field is read-only and can only be written via the parent Transaction's `tax_total` field. total: type: - number - 'null' description: Calculated automatically as amount plus tax, in dollars. Such as `1234.56`. This field is read-only and automatically calculated. expense_account: type: - object - 'null' description: Expense Account assigned to this Expense. properties: uuid: type: string name: type: string required: - uuid - name company: type: - object - 'null' description: Company/vendor assigned to this Expense. properties: uuid: type: string name: type: string required: - uuid - name expense_category: type: - object - 'null' description: Expense Category assigned to this Expense. properties: uuid: type: string name: type: string required: - uuid - name required: - uuid - created_at - updated_at - transaction_uuid - date - invoice_number - name - class - amount - tax - total - expense_account - company - expense_category title: Expense Line Item securitySchemes: PublicApiBearerAuth: type: http description: 'Use the Public API key provided by FlipperForce as a Bearer token. Send the key exactly as provided in the Authorization header: `Authorization: Bearer `.' scheme: bearer bearerFormat: FlipperForce Public API key