API reference / Expenses
Expenses API
27 endpoints. Scopes: Scalar360.expenses.READ, .CREATE, .UPDATE, .DELETE or .ALL. All calls need Authorization: Scalar360-oauthtoken <access_token> — see Authentication.
List
/api/v1/expenses
Scope: Scalar360.expenses.READ
| Parameter | In | Type | Required |
|---|---|---|---|
scope | query | string (default mine) | No |
status | query | string | No |
q | query | string | No |
startDate | query | string (date) | No |
endDate | query | string (date) | No |
page | query | integer | No |
pageSize | query | integer | No |
sortBy | query | string | No |
sortDir | query | string | No |
curl -X GET "https://api.scalar360.com/api/v1/expenses" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Create
/api/v1/expenses
Scope: Scalar360.expenses.CREATE
| Body field | Type | Required | Notes |
|---|---|---|---|
title | string | Yes | required, not blank |
notes | string | ||
reimburseViaPayroll | boolean | ||
projectId | string (uuid) | ||
customerId | string (uuid) | ||
items | array of object | ||
items[].categoryId | string (uuid) | ||
items[].expenseDate | string (date) | ||
items[].merchant | string | ||
items[].description | string | ||
items[].amount | number | ||
items[].gstRate | number | ||
items[].paidVia | string | ||
items[].billable | boolean | ||
items[].projectId | string (uuid) | ||
items[].customerId | string (uuid) | ||
items[].isMileage | boolean | ||
items[].distanceKm | number | ||
items[].ratePerKm | number | ||
items[].receiptObjectKey | string | ||
items[].receiptName | string | ||
items[].receiptContentType | string | ||
items[].receiptSize | integer |
curl -X POST "https://api.scalar360.com/api/v1/expenses" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"string"}'Get
/api/v1/expenses/{id}
Scope: Scalar360.expenses.READ
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X GET "https://api.scalar360.com/api/v1/expenses/{id}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Update
/api/v1/expenses/{id}
Scope: Scalar360.expenses.UPDATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
| Body field | Type | Required | Notes |
|---|---|---|---|
title | string | Yes | required, not blank |
notes | string | ||
reimburseViaPayroll | boolean | ||
projectId | string (uuid) | ||
customerId | string (uuid) | ||
items | array of object | ||
items[].categoryId | string (uuid) | ||
items[].expenseDate | string (date) | ||
items[].merchant | string | ||
items[].description | string | ||
items[].amount | number | ||
items[].gstRate | number | ||
items[].paidVia | string | ||
items[].billable | boolean | ||
items[].projectId | string (uuid) | ||
items[].customerId | string (uuid) | ||
items[].isMileage | boolean | ||
items[].distanceKm | number | ||
items[].ratePerKm | number | ||
items[].receiptObjectKey | string | ||
items[].receiptName | string | ||
items[].receiptContentType | string | ||
items[].receiptSize | integer |
curl -X PUT "https://api.scalar360.com/api/v1/expenses/{id}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"string","notes":"string","reimburseViaPayroll":true,"projectId":"3f1c2b9e-7a1d-4c3e-9b2a-1e5f6a7b8c9d","customerId":"3f1c2b9e-7a1d-4c3e-9b2a-1e5f6a7b8c9d","items":[{"categoryId":"3f1c2b9e-7a1d-4c3e-9b2a-1e5f6a7b8c9d","expenseDate":"2026-10-12","merchant":"string","description":"string","amount":100,"gstRate":100}]}'Delete
/api/v1/expenses/{id}
Scope: Scalar360.expenses.DELETE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X DELETE "https://api.scalar360.com/api/v1/expenses/{id}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Approve
/api/v1/expenses/{id}/approve
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
| Body field | Type | Required | Notes |
|---|---|---|---|
note | string |
curl -X POST "https://api.scalar360.com/api/v1/expenses/{id}/approve" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"note":"string"}'Cancel
/api/v1/expenses/{id}/cancel
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X POST "https://api.scalar360.com/api/v1/expenses/{id}/cancel" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Finance approve
/api/v1/expenses/{id}/finance-approve
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
| Body field | Type | Required | Notes |
|---|---|---|---|
note | string |
curl -X POST "https://api.scalar360.com/api/v1/expenses/{id}/finance-approve" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"note":"string"}'Reimburse
/api/v1/expenses/{id}/reimburse
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
| Body field | Type | Required | Notes |
|---|---|---|---|
mode | string | ||
reference | string | ||
date | string (date) |
curl -X POST "https://api.scalar360.com/api/v1/expenses/{id}/reimburse" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"string","reference":"string","date":"2026-10-12"}'Reject
/api/v1/expenses/{id}/reject
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
| Body field | Type | Required | Notes |
|---|---|---|---|
note | string |
curl -X POST "https://api.scalar360.com/api/v1/expenses/{id}/reject" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"note":"string"}'Submit
/api/v1/expenses/{id}/submit
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X POST "https://api.scalar360.com/api/v1/expenses/{id}/submit" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"List
/api/v1/expenses/approval-workflows
Scope: Scalar360.expenses.READ
curl -X GET "https://api.scalar360.com/api/v1/expenses/approval-workflows" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Create
/api/v1/expenses/approval-workflows
Scope: Scalar360.expenses.CREATE
| Body field | Type | Required | Notes |
|---|---|---|---|
name | string | Yes | required, not blank |
minAmount | number | ||
isDefault | boolean | ||
active | boolean | ||
levels | array of object | ||
levels[].approverUserId | string | ||
levels[].approverName | string |
curl -X POST "https://api.scalar360.com/api/v1/expenses/approval-workflows" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"string"}'Update
/api/v1/expenses/approval-workflows/{id}
Scope: Scalar360.expenses.UPDATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
| Body field | Type | Required | Notes |
|---|---|---|---|
name | string | Yes | required, not blank |
minAmount | number | ||
isDefault | boolean | ||
active | boolean | ||
levels | array of object | ||
levels[].approverUserId | string | ||
levels[].approverName | string |
curl -X PUT "https://api.scalar360.com/api/v1/expenses/approval-workflows/{id}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"string","minAmount":100,"isDefault":true,"active":true,"levels":[{"approverUserId":"string","approverName":"string"}]}'Delete
/api/v1/expenses/approval-workflows/{id}
Scope: Scalar360.expenses.DELETE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X DELETE "https://api.scalar360.com/api/v1/expenses/approval-workflows/{id}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Dashboard
/api/v1/expenses/dashboard
Scope: Scalar360.expenses.READ
curl -X GET "https://api.scalar360.com/api/v1/expenses/dashboard" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Upload receipt
/api/v1/expenses/receipts
Scope: Scalar360.expenses.CREATE
Request body: multipart/form-data with a file field.
curl -X POST "https://api.scalar360.com/api/v1/expenses/receipts" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-F "file=@/path/to/file"List
/api/v1/expenses/recurring
Scope: Scalar360.expenses.READ
curl -X GET "https://api.scalar360.com/api/v1/expenses/recurring" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Create
/api/v1/expenses/recurring
Scope: Scalar360.expenses.CREATE
| Body field | Type | Required | Notes |
|---|---|---|---|
name | string | Yes | required |
categoryId | string (uuid) | ||
merchant | string | ||
description | string | ||
amount | number | ||
gstRate | number | ||
paidThrough | string | ||
billable | boolean | ||
customerId | string (uuid) | ||
projectId | string (uuid) | ||
frequency | string | ||
startDate | string (date) | ||
endDate | string (date) | ||
neverExpires | boolean | ||
nextDate | string (date) | ||
active | boolean | ||
notes | string |
curl -X POST "https://api.scalar360.com/api/v1/expenses/recurring" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"string"}'Get
/api/v1/expenses/recurring/{id}
Scope: Scalar360.expenses.READ
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X GET "https://api.scalar360.com/api/v1/expenses/recurring/{id}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Update
/api/v1/expenses/recurring/{id}
Scope: Scalar360.expenses.UPDATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
| Body field | Type | Required | Notes |
|---|---|---|---|
name | string | Yes | required |
categoryId | string (uuid) | ||
merchant | string | ||
description | string | ||
amount | number | ||
gstRate | number | ||
paidThrough | string | ||
billable | boolean | ||
customerId | string (uuid) | ||
projectId | string (uuid) | ||
frequency | string | ||
startDate | string (date) | ||
endDate | string (date) | ||
neverExpires | boolean | ||
nextDate | string (date) | ||
active | boolean | ||
notes | string |
curl -X PUT "https://api.scalar360.com/api/v1/expenses/recurring/{id}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"string","categoryId":"3f1c2b9e-7a1d-4c3e-9b2a-1e5f6a7b8c9d","merchant":"string","description":"string","amount":100,"gstRate":100}'Delete
/api/v1/expenses/recurring/{id}
Scope: Scalar360.expenses.DELETE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X DELETE "https://api.scalar360.com/api/v1/expenses/recurring/{id}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Generate
/api/v1/expenses/recurring/{id}/generate
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X POST "https://api.scalar360.com/api/v1/expenses/recurring/{id}/generate" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Toggle
/api/v1/expenses/recurring/{id}/toggle
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
id | path | string (uuid) | Yes |
curl -X POST "https://api.scalar360.com/api/v1/expenses/recurring/{id}/toggle" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"From claim
/api/v1/expenses/recurring/from-claim/{claimId}
Scope: Scalar360.expenses.CREATE
| Parameter | In | Type | Required |
|---|---|---|---|
claimId | path | string (uuid) | Yes |
| Body field | Type | Required | Notes |
|---|---|---|---|
name | string | Yes | required |
categoryId | string (uuid) | ||
merchant | string | ||
description | string | ||
amount | number | ||
gstRate | number | ||
paidThrough | string | ||
billable | boolean | ||
customerId | string (uuid) | ||
projectId | string (uuid) | ||
frequency | string | ||
startDate | string (date) | ||
endDate | string (date) | ||
neverExpires | boolean | ||
nextDate | string (date) | ||
active | boolean | ||
notes | string |
curl -X POST "https://api.scalar360.com/api/v1/expenses/recurring/from-claim/{claimId}" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"string"}'Get settings
/api/v1/expenses/settings
Scope: Scalar360.expenses.READ
curl -X GET "https://api.scalar360.com/api/v1/expenses/settings" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN"Update settings
/api/v1/expenses/settings
Scope: Scalar360.expenses.UPDATE
curl -X PUT "https://api.scalar360.com/api/v1/expenses/settings" \
-H "Authorization: Scalar360-oauthtoken $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'