Skip to main content
Group expenses into reports, manage report lifecycle, and submit expense reports for approval using the Expense API. Group expenses into reports, manage the report lifecycle, and submit reports for approval using either dynamic Fields or direct JSON payloads.

Overview

Expense reports collect one or more expense records into a single submission unit. Users typically create a report, add eligible expenses, review totals and required fields, then submit the report for approval.

Report lifecycle

Expense reports move through a lifecycle as users submit them and approvers process them: Use processStatus to query broad lifecycle groups:

API endpoints

Step 1: List reports

List reports for an organization by processStatus:
bash
Use this to build report tabs such as Draft, Submitted, Approved, and Rejected. Common include values:

Step 2: Initialize report fields

Use the report fields endpoint when your application renders the report form dynamically:
bash
To edit an existing report, pass the report ID:
bash
The response contains fields such as:
Always send the complete fields array when updating report fields — including hidden fields and fields the user did not modify.

Step 3: Add expenses to a report

A report groups expense records by ID. In a Fields-based UI, users typically select expenses through the expenseRecords field. In JSON format, you provide the expense record IDs directly. To list expenses that can be added to a report, use the canBeAddedToReport filter:
bash

JSON example

bash

Fields example

bash

Step 4: Manage report lifecycle

Use meta.capabilities to decide which actions to show in your UI. Capabilities may change based on report status, organization settings, and whether the report contains validation errors. Common capabilities include:

Update a report

Using Fields:
bash
Using JSON:
bash

Delete a draft report

bash

Step 5: Submit for approval

Submit the report when it is complete:
bash
Do not send a request body when using action=send. The API returns 400 BODY_NOT_ALLOWED if the submit request includes a body.
After submission, the report enters the approval workflow configured for the organization. The report status typically changes to APPROVAL, and approvers can review, approve, or reject the included expenses.
Check meta.capabilities.canBeSentIn before showing a submit button. If submission fails, the API may return validation errors that explain which expense or report field must be corrected.

Retract a submitted report

If the workflow state allows it, retract a submitted report from approval:
bash
Only show this action when meta.capabilities.canBeRetracted is true. Retracting a report returns it from the approval flow so the user can make changes before submitting it again.

Best practices

Use Dynamic Fields when users create or edit reports in your application. Report-level custom dimensions, recipient fields, and expense selection rules can vary by organization, and Fields keeps your UI aligned with those settings.
Build report tabs using processStatus instead of maintaining your own status grouping. For example, use DRAFT for editable reports, PROCESSING for submitted reports, PROCESSED for completed reports, and REJECTED for rejected reports.
meta.abbreviation contains formatted values for dates, amounts, and labels. Use these values in report lists to match Findity’s formatting and localization.
When a report is rejected, show the rejection reason and let the user edit the report or included expenses if capabilities allow it. Re-fetch the report fields before editing so you display the latest validation state.

Last modified on August 31, 2026