V0 - Bulk send expense reports
Sends multiple expense reports in a single request, batching them into one export file. This matches the behavior of selecting and sending multiple reports at once in the Findity UI.
Reports that cannot be sent are returned in invalidReports — the remaining valid reports are still sent.
PUT
/
expensereports
/
bulksendreports
V0 - Bulk send expense reports
curl --request PUT \
--url https://stage-expense.findity.com/api/admin/expensereports/bulksendreports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"f328e47d595c40ad80f27f52626c5b92",
"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"
],
"date": null
}
'import requests
url = "https://stage-expense.findity.com/api/admin/expensereports/bulksendreports"
payload = {
"ids": ["f328e47d595c40ad80f27f52626c5b92", "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"],
"date": None
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
ids: ['f328e47d595c40ad80f27f52626c5b92', 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4'],
date: null
})
};
fetch('https://stage-expense.findity.com/api/admin/expensereports/bulksendreports', 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-expense.findity.com/api/admin/expensereports/bulksendreports",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'ids' => [
'f328e47d595c40ad80f27f52626c5b92',
'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4'
],
'date' => null
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://stage-expense.findity.com/api/admin/expensereports/bulksendreports"
payload := strings.NewReader("{\n \"ids\": [\n \"f328e47d595c40ad80f27f52626c5b92\",\n \"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"\n ],\n \"date\": null\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://stage-expense.findity.com/api/admin/expensereports/bulksendreports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"f328e47d595c40ad80f27f52626c5b92\",\n \"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"\n ],\n \"date\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://stage-expense.findity.com/api/admin/expensereports/bulksendreports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"f328e47d595c40ad80f27f52626c5b92\",\n \"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"\n ],\n \"date\": null\n}"
response = http.request(request)
puts response.read_body{
"reports": [
{
"id": "f328e47d595c40ad80f27f52626c5b92",
"name": "Expense Report May 2026",
"status": "SENT"
},
{
"id": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
"name": "Travel Report April 2026",
"status": "SENT"
}
],
"invalidReports": [],
"jobid": "job-abc123"
}{
"code": "invalid_report_status",
"description": "One or more reports are not in a sendable status."
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
List of expense report IDs to send. All reports will be batched into a single export file.
Minimum array length:
1Example:
[
"f328e47d595c40ad80f27f52626c5b92",
"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"
]
Optional date to associate with the export. If omitted, the current date is used.
Example:
"2026-05-04T00:00:00Z"
Response
The batch was processed. Check invalidReports for any reports that could not be sent.
The ID of the background job processing the batch send.
Example:
"job-abc123"
Last modified on August 31, 2026
⌘I
V0 - Bulk send expense reports
curl --request PUT \
--url https://stage-expense.findity.com/api/admin/expensereports/bulksendreports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"f328e47d595c40ad80f27f52626c5b92",
"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"
],
"date": null
}
'import requests
url = "https://stage-expense.findity.com/api/admin/expensereports/bulksendreports"
payload = {
"ids": ["f328e47d595c40ad80f27f52626c5b92", "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"],
"date": None
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
ids: ['f328e47d595c40ad80f27f52626c5b92', 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4'],
date: null
})
};
fetch('https://stage-expense.findity.com/api/admin/expensereports/bulksendreports', 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-expense.findity.com/api/admin/expensereports/bulksendreports",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'ids' => [
'f328e47d595c40ad80f27f52626c5b92',
'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4'
],
'date' => null
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://stage-expense.findity.com/api/admin/expensereports/bulksendreports"
payload := strings.NewReader("{\n \"ids\": [\n \"f328e47d595c40ad80f27f52626c5b92\",\n \"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"\n ],\n \"date\": null\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://stage-expense.findity.com/api/admin/expensereports/bulksendreports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"f328e47d595c40ad80f27f52626c5b92\",\n \"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"\n ],\n \"date\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://stage-expense.findity.com/api/admin/expensereports/bulksendreports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"f328e47d595c40ad80f27f52626c5b92\",\n \"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4\"\n ],\n \"date\": null\n}"
response = http.request(request)
puts response.read_body{
"reports": [
{
"id": "f328e47d595c40ad80f27f52626c5b92",
"name": "Expense Report May 2026",
"status": "SENT"
},
{
"id": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
"name": "Travel Report April 2026",
"status": "SENT"
}
],
"invalidReports": [],
"jobid": "job-abc123"
}{
"code": "invalid_report_status",
"description": "One or more reports are not in a sendable status."
}
