Get expense report for organization
Retrieves a specific expense report by id for the organization.
curl --request GET \
--url https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports/{reportId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports/{reportId}"
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/{reportId}', 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/{reportId}",
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/{reportId}"
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/{reportId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports/{reportId}")
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{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Business Trip Stockholm",
"personId": "123e4567-e89b-12d3-a456-426614174000",
"organizationId": "550e8400-e29b-41d4-a716-446655440001",
"dateCreated": "2024-01-15T09:30:00Z",
"lastUpdated": "2024-01-16T14:45:00Z",
"reportNumber": "ER-2024-001",
"comment": "Business trip to Stockholm for client meeting",
"emailRecipients": "manager@company.com;finance@company.com",
"status": "APPROVED",
"processStatus": "PROCESSED",
"type": "MANUAL",
"reimbursement": 2580.5,
"reimbursementCurrency": "SEK",
"sent": "2024-01-16T10:00:00Z",
"paid": "2024-01-18T00:00:00Z",
"approved": "2024-01-17T15:30:00Z",
"previewUrl": "https://expense.findity.com/api/expensereports/550e8400-e29b-41d4-a716-446655440000",
"meta": {
"autoApproval": {
"status": "REJECTED",
"reasons": [
{
"reason": "POLICY_FAILURE",
"description": "Violates the company's expense policy."
},
{
"reason": "WEEKEND_PURCHASE_DATE",
"description": "The purchase was made during a weekend."
}
]
}
},
"expenseRecords": [
{
"id": "rec1-550e8400-e29b-41d4-a716-446655440000",
"status": "APPROVED",
"personId": "123e4567-e89b-12d3-a456-426614174000",
"organizationId": "550e8400-e29b-41d4-a716-446655440001",
"categoryId": "cat1-550e8400-e29b-41d4-a716-446655440000",
"expenseReportId": "550e8400-e29b-41d4-a716-446655440000",
"dateCreated": "2024-01-15T09:30:00Z",
"lastUpdated": "2024-01-16T14:45:00Z",
"reimbursement": 1250,
"reimbursementCurrency": "SEK",
"rejectComment": null,
"meta": {
"categoryIconUrl": "https://expense.findity.com/api/resources/8a5f867e9b204742a8cc2ca2b6c57358"
}
},
{
"id": "rec2-550e8400-e29b-41d4-a716-446655440000",
"status": "APPROVED",
"personId": "123e4567-e89b-12d3-a456-426614174000",
"organizationId": "550e8400-e29b-41d4-a716-446655440001",
"categoryId": "cat2-550e8400-e29b-41d4-a716-446655440000",
"expenseReportId": "550e8400-e29b-41d4-a716-446655440000",
"dateCreated": "2024-01-15T18:45:00Z",
"lastUpdated": "2024-01-16T14:45:00Z",
"reimbursement": 1330.5,
"reimbursementCurrency": "SEK",
"rejectComment": null,
"meta": {
"categoryIconUrl": "https://expense.findity.com/api/resources/9b6f977f8c305753b9dd3db3c7d68469"
}
}
],
"ownerName": "John Doe",
"firstName": "John",
"lastName": "Doe",
"organizationName": "Acme Corporation",
"organizationNumber": "556123-4567",
"organizationLanguage": "en",
"organizationUseNewDimensions": true,
"organizationRequiresAttestation": false,
"organizationUsesPaymentBasis": true,
"expenseRecordCount": 2,
"totalAmount": 2580.5,
"userCanModifyReports": true,
"userCanSendReports": true,
"reportGroup": 1,
"onHoldStatus": {
"onHold": false,
"reason": null
},
"bank": "SEB1234567890",
"dueDate": "2024-01-25T00:00:00Z",
"cardNumber": "**** **** **** 1234",
"invoiceRef": "INV-2024-001",
"invoiceNumber": "INV-2024-001",
"invoiceDate": "2024-01-15T00:00:00Z",
"externalVoucherNumber": "EXT-12345",
"externalVoucherInformation": "Successfully exported to external system",
"externalVoucherErrorInformation": null,
"externalVoucherId": "ext-voucher-550e8400-e29b-41d4-a716-446655440000",
"reminderSentToUser": false,
"employeeId": "EMP001",
"reminderSentToApprover": false,
"hasRejectedExpenseRecords": false,
"hasIncorrectApprovalChains": false,
"approvalAllowed": true,
"currentApproverInfo": {
"approverId": "456e7890-e89b-12d3-a456-426614174999",
"approverName": "Jane Smith",
"approverEmail": "jane.smith@company.com"
},
"sendChain": {
"currentStep": 2,
"totalSteps": 3,
"nextApprover": {
"approverId": "789e0123-e89b-12d3-a456-426614174888",
"approverName": "Bob Johnson",
"approverEmail": "bob.johnson@company.com"
}
},
"tag": {
"simulatedCardReport": false,
"integrationTest": false,
"dimensions": {
"project": "PROJ-001",
"department": "Sales"
}
},
"customFields": [
{
"fieldDefinitionId": "2b965c866b634698811dabf45a491089",
"value": true
}
]
}{
"result": "error",
"code": "EXPENSE_REPORT_NOT_FOUND",
"description": "Expense report not found"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The unique identifier of the organization UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$"05b8daba9ba14a49846fe77883248cf0"
The id of the expense report to retrieve UUID without dashes (32-character hex string)
^[0-9a-fA-F]{32}$Query Parameters
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 Response
OK
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.
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/{reportId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports/{reportId}"
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/{reportId}', 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/{reportId}",
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/{reportId}"
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/{reportId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://stage-api.findity.com/api/v1/admin/organizations/{organizationId}/reports/{reportId}")
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{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Business Trip Stockholm",
"personId": "123e4567-e89b-12d3-a456-426614174000",
"organizationId": "550e8400-e29b-41d4-a716-446655440001",
"dateCreated": "2024-01-15T09:30:00Z",
"lastUpdated": "2024-01-16T14:45:00Z",
"reportNumber": "ER-2024-001",
"comment": "Business trip to Stockholm for client meeting",
"emailRecipients": "manager@company.com;finance@company.com",
"status": "APPROVED",
"processStatus": "PROCESSED",
"type": "MANUAL",
"reimbursement": 2580.5,
"reimbursementCurrency": "SEK",
"sent": "2024-01-16T10:00:00Z",
"paid": "2024-01-18T00:00:00Z",
"approved": "2024-01-17T15:30:00Z",
"previewUrl": "https://expense.findity.com/api/expensereports/550e8400-e29b-41d4-a716-446655440000",
"meta": {
"autoApproval": {
"status": "REJECTED",
"reasons": [
{
"reason": "POLICY_FAILURE",
"description": "Violates the company's expense policy."
},
{
"reason": "WEEKEND_PURCHASE_DATE",
"description": "The purchase was made during a weekend."
}
]
}
},
"expenseRecords": [
{
"id": "rec1-550e8400-e29b-41d4-a716-446655440000",
"status": "APPROVED",
"personId": "123e4567-e89b-12d3-a456-426614174000",
"organizationId": "550e8400-e29b-41d4-a716-446655440001",
"categoryId": "cat1-550e8400-e29b-41d4-a716-446655440000",
"expenseReportId": "550e8400-e29b-41d4-a716-446655440000",
"dateCreated": "2024-01-15T09:30:00Z",
"lastUpdated": "2024-01-16T14:45:00Z",
"reimbursement": 1250,
"reimbursementCurrency": "SEK",
"rejectComment": null,
"meta": {
"categoryIconUrl": "https://expense.findity.com/api/resources/8a5f867e9b204742a8cc2ca2b6c57358"
}
},
{
"id": "rec2-550e8400-e29b-41d4-a716-446655440000",
"status": "APPROVED",
"personId": "123e4567-e89b-12d3-a456-426614174000",
"organizationId": "550e8400-e29b-41d4-a716-446655440001",
"categoryId": "cat2-550e8400-e29b-41d4-a716-446655440000",
"expenseReportId": "550e8400-e29b-41d4-a716-446655440000",
"dateCreated": "2024-01-15T18:45:00Z",
"lastUpdated": "2024-01-16T14:45:00Z",
"reimbursement": 1330.5,
"reimbursementCurrency": "SEK",
"rejectComment": null,
"meta": {
"categoryIconUrl": "https://expense.findity.com/api/resources/9b6f977f8c305753b9dd3db3c7d68469"
}
}
],
"ownerName": "John Doe",
"firstName": "John",
"lastName": "Doe",
"organizationName": "Acme Corporation",
"organizationNumber": "556123-4567",
"organizationLanguage": "en",
"organizationUseNewDimensions": true,
"organizationRequiresAttestation": false,
"organizationUsesPaymentBasis": true,
"expenseRecordCount": 2,
"totalAmount": 2580.5,
"userCanModifyReports": true,
"userCanSendReports": true,
"reportGroup": 1,
"onHoldStatus": {
"onHold": false,
"reason": null
},
"bank": "SEB1234567890",
"dueDate": "2024-01-25T00:00:00Z",
"cardNumber": "**** **** **** 1234",
"invoiceRef": "INV-2024-001",
"invoiceNumber": "INV-2024-001",
"invoiceDate": "2024-01-15T00:00:00Z",
"externalVoucherNumber": "EXT-12345",
"externalVoucherInformation": "Successfully exported to external system",
"externalVoucherErrorInformation": null,
"externalVoucherId": "ext-voucher-550e8400-e29b-41d4-a716-446655440000",
"reminderSentToUser": false,
"employeeId": "EMP001",
"reminderSentToApprover": false,
"hasRejectedExpenseRecords": false,
"hasIncorrectApprovalChains": false,
"approvalAllowed": true,
"currentApproverInfo": {
"approverId": "456e7890-e89b-12d3-a456-426614174999",
"approverName": "Jane Smith",
"approverEmail": "jane.smith@company.com"
},
"sendChain": {
"currentStep": 2,
"totalSteps": 3,
"nextApprover": {
"approverId": "789e0123-e89b-12d3-a456-426614174888",
"approverName": "Bob Johnson",
"approverEmail": "bob.johnson@company.com"
}
},
"tag": {
"simulatedCardReport": false,
"integrationTest": false,
"dimensions": {
"project": "PROJ-001",
"department": "Sales"
}
},
"customFields": [
{
"fieldDefinitionId": "2b965c866b634698811dabf45a491089",
"value": true
}
]
}{
"result": "error",
"code": "EXPENSE_REPORT_NOT_FOUND",
"description": "Expense report not found"
}
