Expenses
Record and approve expenses, organise them by category and vendor, schedule recurring expenses, turn receipts into expenses, and analyse costs.
Paths are relative to https://api.rushhourapp.com/api/v1. See the API reference overview for how to read each entry.
Truck and office expenses
| Method | Path | Summary |
|---|---|---|
GET | /Expenses | Search expenses. |
POST | /Expenses | Add expense. |
POST | /Expenses/multiple | Add multiple expenses. |
GET | /Expenses/OfficeExpenses | Get office expenses. |
POST | /Expenses/OfficeExpenses | Add or update office expenses. |
POST | /Expenses/RemoveExpense | Delete expense. |
GET | /Expenses/Stats | Get expenses stats. |
GET /Expenses
Search expenses.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
type | query | integer (int32) | No | One of: 0 (Trucks), 1 (DriverRoutePayout), 2 (OutsourceCompanyRoutePayout), 3 (Office). |
Also accepts the shared list parameters.
Response: envelope; data is ExpensePagedList.
POST /Expenses
Add expense.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: Expense (JSON).
Response: envelope; data is Expense.
POST /Expenses/multiple
Add multiple expenses.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: array of Expense (JSON).
Response: envelope; data has no documented shape.
GET /Expenses/OfficeExpenses
Get office expenses.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
date | query | string (date-time) | No |
Response: envelope; data is array of Expense.
POST /Expenses/OfficeExpenses
Add or update office expenses.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: array of Expense (JSON).
Response: envelope; data has no documented shape.
POST /Expenses/RemoveExpense
Delete expense.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
date | query | string (date-time) | No |
Request body: Expense (JSON).
Response: envelope; data has no documented shape.
GET /Expenses/Stats
Get expenses stats.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
endDate | query | string (date-time) | No | |
startDate | query | string (date-time) | No | |
types | query | array of integer (int32) | No | One of: 0 (Trucks), 1 (DriverRoutePayout), 2 (OutsourceCompanyRoutePayout), 3 (Office). |
Response: envelope; data is ExpensesByTypeStats.
Expense transactions
| Method | Path | Summary |
|---|---|---|
GET | /ExpenseLedger | Search expenses and get one page of results, with totals for all matching expenses: amounts by currency, the number of expenses and the number in each approval status. |
POST | /ExpenseLedger | Record an expense. |
GET | /ExpenseLedger/{id} | Get an expense. |
PUT | /ExpenseLedger/{id} | Update an expense. |
DELETE | /ExpenseLedger/{id} | Delete an expense. It can be restored later. |
POST | /ExpenseLedger/{id}/approve | Approve an expense. |
POST | /ExpenseLedger/{id}/assign-order | Attaches the cost to an order, or detaches it. |
POST | /ExpenseLedger/{id}/reject | Reject an expense with a reason. |
POST | /ExpenseLedger/{id}/restore | Restore a deleted expense. |
POST | /ExpenseLedger/{id}/submit | Submit an expense for approval. |
POST | /ExpenseLedger/bulk/approve | Approve several expenses at once. Each expense gets its own result, and one that fails does not stop the others. |
POST | /ExpenseLedger/bulk/categorize | Move several expenses to one category. |
POST | /ExpenseLedger/bulk/reject | Reject several expenses at once with one shared reason. Each expense gets its own result. |
GET /ExpenseLedger
Search expenses and get one page of results, with totals for all matching expenses: amounts by currency, the number of expenses and the number in each approval status.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
ApprovalStatuses | query | array of string | No | One of: Approved, Draft, Submitted, Rejected. |
CategoryIds | query | array of integer (int32) | No | |
DriverIds | query | array of integer (int32) | No | |
EndDate | query | string (date-time) | No | |
ExcludeMeasurementRows | query | boolean | No | |
FuelTypes | query | array of string | No | One of: Diesel, DieselExhaustFluid, ReeferDiesel, Gasoline, Cng, Lng, Propane, Electric, Biodiesel, Other. |
HasDriver | query | boolean | No | |
HasReceipt | query | boolean | No | |
IncludeDeleted | query | boolean | No | |
IsBillableToOrder | query | boolean | No | |
IsCapital | query | boolean | No | |
ItemsPerPage | query | integer (int32) | No | |
JurisdictionState | query | string | No | |
MaxAmount | query | number (double) | No | |
MinAmount | query | number (double) | No | |
OrderId | query | integer (int32) | No | |
Page | query | integer (int32) | No | |
PaymentMethods | query | array of string | No | One of: Unspecified, Cash, CreditCard, FuelCard, Check, Ach, Comchek, DriverAdvance, Other. |
RebillStatuses | query | array of string | No | One of: NotBillable, Pending, Invoiced, Absorbed. |
SearchTerm | query | string | No | |
SortBy | query | string | No | |
SortDirection | query | integer (int32) | No | One of: 0 (Ascending), 1 (Descending). |
Sources | query | array of string | No | One of: MonthlyGrid, Manual, Mobile, Receipt, FuelCardImport, Recurring, Api, Import. |
StartDate | query | string (date-time) | No | |
Subtypes | query | array of integer (int32) | No | One of: 0 (TruckGas), 1 (TruckInsurance), 2 (TruckMaintenance), 3 (TruckPayment), 4 (TruckTrailer), 5 (TruckLicense), 6 (TruckTool), 7 (TruckOther), 8 (TruckMiles), 9 (OdometerStart), 10 (OdometerEnd), 100 (OfficeGPS), 101 (OfficeInternet), 102 (OfficeOther). |
TruckIds | query | array of integer (int32) | No | |
Types | query | array of integer (int32) | No | One of: 0 (Trucks), 1 (DriverRoutePayout), 2 (OutsourceCompanyRoutePayout), 3 (Office). |
UnattributedOnly | query | boolean | No | |
VendorIds | query | array of integer (int32) | No |
Response: envelope; data is ExpenseSearchResultDto.
POST /ExpenseLedger
Record an expense.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: ExpenseDto (JSON).
Response: envelope; data is ExpenseDto.
GET /ExpenseLedger/{id}
Get an expense.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data is ExpenseDto.
PUT /ExpenseLedger/{id}
Update an expense.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Request body: ExpenseDto (JSON).
Response: envelope; data is ExpenseDto.
DELETE /ExpenseLedger/{id}
Delete an expense. It can be restored later.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data has no documented shape.
POST /ExpenseLedger/{id}/approve
Approve an expense.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data is ExpenseDto.
POST /ExpenseLedger/{id}/assign-order
Attaches the cost to an order, or detaches it.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Request body: ExpenseAssignOrderDto (JSON).
Response: envelope; data is ExpenseDto.
POST /ExpenseLedger/{id}/reject
Reject an expense with a reason.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Request body: ExpenseRejectDto (JSON).
Response: envelope; data is ExpenseDto.
POST /ExpenseLedger/{id}/restore
Restore a deleted expense.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data has no documented shape.
POST /ExpenseLedger/{id}/submit
Submit an expense for approval.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data is ExpenseDto.
POST /ExpenseLedger/bulk/approve
Approve several expenses at once. Each expense gets its own result, and one that fails does not stop the others.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: ExpenseBulkActionDto (JSON).
Response: envelope; data is ExpenseBulkResultDto.
POST /ExpenseLedger/bulk/categorize
Move several expenses to one category.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: ExpenseBulkActionDto (JSON).
Response: envelope; data is ExpenseBulkResultDto.
POST /ExpenseLedger/bulk/reject
Reject several expenses at once with one shared reason. Each expense gets its own result.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: ExpenseBulkActionDto (JSON).
Response: envelope; data is ExpenseBulkResultDto.
Expense categories
| Method | Path | Summary |
|---|---|---|
GET | /ExpenseCategories | List expense categories. |
POST | /ExpenseCategories | Create or update an expense category. |
DELETE | /ExpenseCategories/{id} | Permanently delete a category your company created. Built-in categories and categories used by an expense or a recurring expense cannot be deleted; deactivate them instead. |
PATCH | /ExpenseCategories/{id}/deactivate | Deactivate an expense category without changing past expenses. |
POST | /ExpenseCategories/seed | Add the default trucking expense categories if your company has no categories yet, and return the active categories. |
GET /ExpenseCategories
List expense categories.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
includeInactive | query | boolean | No | Default: false. |
Response: envelope; data is array of ExpenseCategoryDto.
POST /ExpenseCategories
Create or update an expense category.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: ExpenseCategoryDto (JSON).
Response: envelope; data is ExpenseCategoryDto.
DELETE /ExpenseCategories/{id}
Permanently delete a category your company created. Built-in categories and categories used by an expense or a recurring expense cannot be deleted; deactivate them instead.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data has no documented shape.
PATCH /ExpenseCategories/{id}/deactivate
Deactivate an expense category without changing past expenses.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data has no documented shape.
POST /ExpenseCategories/seed
Add the default trucking expense categories if your company has no categories yet, and return the active categories.
Required access: the Expenses tab - create/edit/delete data permission.
Response: envelope; data is array of ExpenseCategoryDto.
Expense vendors
| Method | Path | Summary |
|---|---|---|
GET | /ExpenseVendors | List vendors. |
POST | /ExpenseVendors | Create or update a vendor. |
DELETE | /ExpenseVendors/{id} | Permanently delete a vendor that no expense, deleted expense or recurring expense uses; deactivate a vendor that is in use instead. |
PATCH | /ExpenseVendors/{id}/deactivate | Retires a payee without touching history. |
GET | /ExpenseVendors/lookup | List active vendors in a short form, for selection lists. |
GET | /ExpenseVendors/spend-leaderboard | Vendors ranked by total spend in the window, for spend concentration and 1099 prep. |
GET /ExpenseVendors
List vendors.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
includeInactive | query | boolean | No | Default: false. |
Also accepts the shared list parameters.
Response: envelope; data is ExpenseVendorDtoPagedList.
POST /ExpenseVendors
Create or update a vendor.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: ExpenseVendorDto (JSON).
Response: envelope; data is ExpenseVendorDto.
DELETE /ExpenseVendors/{id}
Permanently delete a vendor that no expense, deleted expense or recurring expense uses; deactivate a vendor that is in use instead.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data has no documented shape.
PATCH /ExpenseVendors/{id}/deactivate
Retires a payee without touching history.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data has no documented shape.
GET /ExpenseVendors/lookup
List active vendors in a short form, for selection lists.
Required access: the Expenses tab - view existing data permission.
Response: envelope; data is array of ExpenseVendorDto.
GET /ExpenseVendors/spend-leaderboard
Vendors ranked by total spend in the window, for spend concentration and 1099 prep.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
endDate | query | string (date-time) | No | |
startDate | query | string (date-time) | No | |
top | query | integer (int32) | No | Default: 20. |
Response: envelope; data is array of ExpenseVendorDto.
Recurring expenses
| Method | Path | Summary |
|---|---|---|
GET | /ExpenseRecurring | List recurring expense schedules. |
POST | /ExpenseRecurring | Create or replace a recurring expense schedule. |
DELETE | /ExpenseRecurring/{id} | Removes the schedule. |
PATCH | /ExpenseRecurring/{id}/deactivate | Stops a schedule posting without destroying it (truck sold, policy lapsed, subscription cancelled). |
POST | /ExpenseRecurring/{id}/run-now | Posts the schedule's outstanding occurrence(s) immediately. |
GET | /ExpenseRecurring/committed-spend | Month-by-month committed spend projected from the active schedules, writing nothing. |
GET /ExpenseRecurring
List recurring expense schedules.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
includeInactive | query | boolean | No | Default: false. |
Response: envelope; data is array of ExpenseRecurringScheduleDto.
POST /ExpenseRecurring
Create or replace a recurring expense schedule.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: ExpenseRecurringScheduleDto (JSON).
Response: envelope; data is ExpenseRecurringScheduleDto.
DELETE /ExpenseRecurring/{id}
Removes the schedule.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data has no documented shape.
PATCH /ExpenseRecurring/{id}/deactivate
Stops a schedule posting without destroying it (truck sold, policy lapsed, subscription cancelled).
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data has no documented shape.
POST /ExpenseRecurring/{id}/run-now
Posts the schedule's outstanding occurrence(s) immediately.
Required access: the Expenses tab - create/edit/delete data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer (int32) | Yes |
Response: envelope; data is ExpenseRecurringRunResultDto.
GET /ExpenseRecurring/committed-spend
Month-by-month committed spend projected from the active schedules, writing nothing.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
from | query | string (date-time) | No | |
to | query | string (date-time) | No |
Response: envelope; data is ExpenseCommittedSpendDto.
Receipts
| Method | Path | Summary |
|---|---|---|
POST | /ExpenseReceipts/confirm | Create an expense from reviewed receipt details. |
POST | /ExpenseReceipts/extract/{documentId} | Runs AI extraction over an already-uploaded receipt document and returns the proposed fields. |
POST /ExpenseReceipts/confirm
Create an expense from reviewed receipt details.
Required access: the Expenses tab - create/edit/delete data permission.
Request body: ReceiptExpenseConfirmRequest (JSON).
Response: envelope; data is ReceiptExpenseDraftDto.
POST /ExpenseReceipts/extract/{documentId}
Runs AI extraction over an already-uploaded receipt document and returns the proposed fields.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
documentId | path | integer (int32) | Yes |
Response: envelope; data is ReceiptExtractionResult.
Expense analytics
| Method | Path | Summary |
|---|---|---|
GET | /ExpenseAnalytics/benchmark | Get industry cost-per-mile benchmark figures. |
GET | /ExpenseAnalytics/by-truck | Per-truck cost lines for one date range. |
GET | /ExpenseAnalytics/category-trend | Get monthly totals for one expense category. |
GET | /ExpenseAnalytics/summary | Get total expense spend and its breakdown for a date range. |
GET | /ExpenseAnalytics/trend | Get monthly expense totals for recent months. |
GET | /ExpenseAnalytics/truck/{truckId} | Get the expense breakdown for one truck. |
GET /ExpenseAnalytics/benchmark
Get industry cost-per-mile benchmark figures.
Required access: the Expenses tab - view existing data permission.
Response: envelope; data is ExpenseBenchmarkDto.
GET /ExpenseAnalytics/by-truck
Per-truck cost lines for one date range.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
endDate | query | string (date-time) | No | |
startDate | query | string (date-time) | No |
Response: envelope; data is array of ExpenseByTruckDto.
GET /ExpenseAnalytics/category-trend
Get monthly totals for one expense category.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
categoryId | query | integer (int32) | No | |
months | query | integer (int32) | No | Default: 12. |
Response: envelope; data is ExpenseCategoryTrendDto.
GET /ExpenseAnalytics/summary
Get total expense spend and its breakdown for a date range.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
endDate | query | string (date-time) | No | |
startDate | query | string (date-time) | No |
Response: envelope; data is ExpenseAnalyticsSummaryDto.
GET /ExpenseAnalytics/trend
Get monthly expense totals for recent months.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
months | query | integer (int32) | No | Default: 12. |
Response: envelope; data is array of ExpenseMonthlyTrendPointDto.
GET /ExpenseAnalytics/truck/{truckId}
Get the expense breakdown for one truck.
Required access: the Expenses tab - view existing data permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
truckId | path | integer (int32) | Yes | |
endDate | query | string (date-time) | No | |
months | query | integer (int32) | No | Default: 0. |
startDate | query | string (date-time) | No |
Response: envelope; data is ExpenseTruckDetailDto.