List expense reports for organization
Lists expense reports for the specified organization.
curl --request GET \
--url https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports \
--header 'Authorization: Bearer <token>'import requests
url = "https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"meta": {
"count": 10,
"total": 242,
"externalReports": [
{
"id": "9f2c41ab",
"name": "Payroll batch 2026-04",
"downloadUrl": "https://integration.findity.com/ce-integration-kpmg/downloadReport?reportId=9f2c41ab",
"sendUrl": "https://integration.findity.com/ce-integration-kpmg/sendReport?reportId=9f2c41ab",
"status": "READY_TO_SEND",
"integrationPluginName": "ce-integration-kpmg"
}
]
},
"data": []
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The organization id
Query Parameters
Comma separated list of statuses to include, to exclude a status use ! before the status
APPROVAL, APPROVED, BULK_TRANSFER, DELETED, ERROR, NEW, NORMAL, ON_HOLD, PAID, READY_TO_SEND, REJECTED, REVIEW, SEND, SENT, TRANSFER, TRANSFER_TO_RECIPIENT Parameter used to include additional data in the response. Available options:
- expenseRecords: Include all expense records in the report
- approvalChain: Include approval chain information (reminderSentToApprover, hasRejectedExpenseRecords, hasIncorrectApprovalChains, currentApproverInfo, approvalAllowed)
- sendChain: Include send chain information (sendChain, hasIncorrectApprovalChains)
- employeeId: Include the employee ID of the report owner
- tag: Include tag information (simulatedCardReport, integrationTest, dimensions)
- externalReports: Include reports an integration module is still working on, under meta.externalReports
- meta.violations: Include the report's policy violations
- meta.messages: Include the direct messages attached to the report
- meta.autoApproval: Include the AI review guidance verdict for the report
- meta.ids: Include the ids of every report matching the filter, ignoring pagination, under meta.ids
expenseRecords, approvalChain, sendChain, employeeId, tag, externalReports, meta.violations, meta.messages, meta.autoApproval, meta.ids Max records to return
1 <= x <= 1000Offset to be used in list
x >= 0Parameter used in the search
Sort parameter for expense reports. Accepts one or more sorting criteria in the format property:direction, where property is one of name, dateCreated, sent, reportNumber, ownerName, totalAmount, organizationName, organizationNumber, approved, lastUpdated, paid, status, employeeId, dueDate; and direction is either asc or desc. Multiple criteria can be provided as a comma-separated list. Default is lastUpdated:desc. Company card listings (companyCardOnly=true) always append owner last name ascending as a secondary sort, so the order within tied values is stable across pages.
Filter ON_HOLD reports by substatus
card_not_configured, reserved_transaction Used for filtering
Used for filtering
When true, only company card expense reports are returned. The response meta will also include aggregated totalAmount and totalExpenses for the whole filtered set.
Filters the listing to reports whose next recipient is this one, meaning the step with the lowest sortOrder among the steps still in TRANSFER_TO_RECIPIENT. Used by the Ready to send tab, which is split per recipient. Only applied to organization listings.
UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$Zero based index of the report group to return, used by the Ready to send tab to split a large listing into slices. Reports are assigned to a group by their creation time, so the groups are stable and disjoint. Only applied when the owner is configured with more than one group (an organization's reportGroupSettings.numberOfRTSGroups, or a partner's numberOfReportGroups); otherwise the parameter is ignored and the full listing is returned.
x >= 0Response
OK
Hide child attributes
Hide child attributes
Aggregated amount across the whole filtered set, ignoring pagination. Only returned for companyCardOnly listings.
Aggregated expense record count across the whole filtered set, ignoring pagination. Only returned for companyCardOnly listings.
Expense reports an integration module has not finished yet, so they are not in data. Returned for include=externalReports. Empty when the integration has nothing in progress or is unavailable.
Hide child attributes
Hide child attributes
Id of the report inside the integration module. String, required.
Display name of the report. String, optional.
Absolute url for downloading the report. String.
Absolute url for making the integration send the report. String.
Always READY_TO_SEND. String, enum.
READY_TO_SEND Name of the integration plugin the report came from. String.
The ids of every expense report matching the filter, ignoring pagination and max, so a client can offer "select all on all pages" without paging through the whole result. Returned for include=meta.ids. There is no upper bound, so the array grows with the size of the filtered set - ask for it only when the listing actually offers a bulk selection, and narrow the filter first on organizations with a lot of reports.
UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
NEW, NORMAL, APPROVAL, APPROVED, REJECTED UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$Date when the expense report was paid. ISO-8601 format (e.g., 2024-01-15T10:30:00Z). Read-only.
Date when the expense report was approved. ISO-8601 format (e.g., 2024-01-15T10:30:00Z). Read-only.
APPROVAL, APPROVED, READY_TO_SEND, BULK_TRANSFER, ERROR, NEW, NORMAL, ON_HOLD, PAID, REJECTED, SEND, SENT, TRANSFER, TRANSFER_TO_RECIPIENT, REVIEW DRAFT, PROCESSING, PROCESSED, REJECTED AUTOMATIC, MANUAL, COMPANY_CARD First name of the expense report owner
Last name of the expense report owner
Error information from admin operations
Review type for the organization. None, before approval, or after approval. The AFTER_SEND value actually means before approval.
NONE, AFTER_SEND, AFTER_APPROVAL Number of expense records in this report
Total amount of all expense records in the report
On-hold status information
Hide child attributes
Hide child attributes
List of cards missing configuration
List of expense record IDs with authorization status transactions
Whether all transactions are eligible for manual clearing
Bank information for payment
Payment due date. ISO-8601 format (e.g., 2024-01-15T10:30:00Z).
Card number (masked)
Invoice reference
Invoice number
Invoice date. ISO-8601 format (e.g., 2024-01-15T10:30:00Z).
External voucher number from integration
External voucher information
Error information from external voucher system
External voucher ID
Whether a reminder has been sent to the user
Employee ID (included when 'employeeId' is in include parameter)
Whether an approver has been reminded (included when 'approvalChain' is in include parameter)
Whether the report has rejected expense records (included when 'approvalChain' is in include parameter)
Whether the report has incorrect approval chains (included when 'approvalChain' or 'sendChain' is in include parameter)
Whether approval is allowed for this report (included when 'approvalChain' is in include parameter)
Information about the current approver (included when 'approvalChain' is in include parameter)
Hide child attributes
Hide child attributes
Whether the report has a single approver
Whether the report has incorrect approval chains
The approval chain ID
Full name of the current approver
Email address of the current approver
Send chain information (included when 'sendChain' is in include parameter)
Hide child attributes
Hide child attributes
Whether every active step in the chain has been sent
List of senders in the chain
Hide child attributes
Hide child attributes
Status of this step in the chain. The step a report is currently waiting on is the one with the lowest sortOrder among the steps still in TRANSFER_TO_RECIPIENT, which is what the recipientId filter matches on.
The recipient this step sends to
Position of this step in the chain, ascending
Whether this step collects the report instead of sending it on
The per expense record send instances belonging to this step
Hide child attributes
Hide child attributes
External id of the record send instance
The expense record this instance belongs to
Voucher number the recipient booked the record under
The recipient's own id for the voucher
Link to the voucher in the recipient system
Message returned by the recipient for this record
Error returned by the recipient for this record
When the recipient booked the record
Whether the record was part of what was sent to the recipient
Unique voucher numbers
Number of non-booked expenses
Number of booked expenses
Aggregated voucher numbers
Aggregated voucher information
Aggregated voucher error information
Server-computed metadata for the report. Each property is opt-in through the include parameter.
Hide child attributes
Hide child attributes
AI review guidance for the report, produced by the Controller agent and rolled up from the verdicts on the report's expenses. Only present when 'meta.autoApproval' is in the include parameter, the feature is enabled for the organization, and the agent has reached a verdict for every expense in the report.
Hide child attributes
Hide child attributes
The verdict for the whole report. APPROVED means the report is low risk and needs no manual attention. REJECTED means at least one of its expenses was flagged and the report needs manual review - no rejection has taken place and the report's own status is unaffected. The two values match the per-expense verdict the expense API already exposes under meta.autoApproval, so a client can use one mapping for both. A report the agent has not finished with is omitted entirely rather than reported as pending.
APPROVED, REJECTED Why the agent reached that verdict, in the same wording the approver app shows the end user and already translated for the caller's locale. For REJECTED these are the deviations found on the report's expenses, de-duplicated across them and ordered by reason code. For APPROVED these are the checks that came back clean. Omitted when there is nothing to show, so a REJECTED report can arrive without it.
Hide child attributes
Hide child attributes
The check the agent ran. The set is closed and matches the agent's reason types; new codes are only added together with a new agent capability.
SIMILAR_REJECTED_ORG, SIMILAR_REJECTED_PERSON, SIMILAR_REJECTED_GLOBAL, POLICY_FAILURE, NOT_VALID_RECEIPT, DEVIATING_AMOUNT_ORG, DEVIATING_AMOUNT_PERSON, DEVIATING_AMOUNT_GLOBAL, PREDICT_AMOUNT_DEVIATION, WEEKEND_PURCHASE_DATE, SPECIAL_ITEM_ALCOHOL, SPECIAL_ITEM_TOBACCO The translated sentence shown for that reason.
curl --request GET \
--url https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports \
--header 'Authorization: Bearer <token>'import requests
url = "https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"meta": {
"count": 10,
"total": 242,
"externalReports": [
{
"id": "9f2c41ab",
"name": "Payroll batch 2026-04",
"downloadUrl": "https://integration.findity.com/ce-integration-kpmg/downloadReport?reportId=9f2c41ab",
"sendUrl": "https://integration.findity.com/ce-integration-kpmg/sendReport?reportId=9f2c41ab",
"status": "READY_TO_SEND",
"integrationPluginName": "ce-integration-kpmg"
}
]
},
"data": []
}
