group_by group, with the group's subtotals and a totals row per currency./owner/reports/report/expenses?summary=0. Figures are in each expense's own currency, one block per currency, unless currency=All converts them. An expense split across several journal accounts appears once per account, with that account's amount and note.400 rather than truncated; narrow the dates or add a filter. The refusal carries a rows entry in validation_errors.curl --location '/api2/reports/expenses_details?group_by=Staff&from_date=2026-03-01&to_date=2026-03-31&treasury_id=&vendor=&category_id=&journal_account_id=&supplier_id=&branch_id=&is_mileage=¤cy=' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ' \
--header 'apikey: ' \
--header 'Content-Type: application/json'{
"result": "successful",
"code": 200,
"data": {
"report": {
"key": "expenses_details",
"title": "string",
"summary": false,
"group_by": "Yearly",
"currency": "string"
},
"filters": {
"group_by": "Yearly",
"from_date": "2019-08-24",
"to_date": "2019-08-24",
"treasury_id": 0,
"vendor": "string",
"category_id": 0,
"journal_account_id": [
0
],
"supplier_id": [
0
],
"branch_id": [
0
],
"is_mileage": "0",
"currency": "string"
},
"columns": [
{
"key": "string",
"label": "string"
}
],
"blocks": [
{
"currency": "string",
"totals": {
"amount_without_tax": 0,
"total_tax": 0,
"amount": 0
},
"groups": [
{
"key": "string",
"subtotals": {
"amount_without_tax": 0,
"total_tax": 0,
"amount": 0
},
"expenses": [
{
"id": 0,
"code": "string",
"date": "2019-08-24",
"treasury": "string",
"category": "string",
"vendor": "string",
"journal_account": "string",
"entered_by": "string",
"note": "string",
"branch": "string",
"amount_without_tax": 0,
"total_tax": 0,
"amount": 0,
"currency": "string"
}
]
}
]
}
],
"meta": {
"currency_count": 0,
"group_count": 0,
"expense_count": 0
}
}
}