Generate user, hourly, payroll, project, and expense reports with Public API v1.
On this page
14. Reports
Many report resources expose GET (query string) and POST (JSON body) with the same filters. Prefer POST when ID lists are large.
User info — GET /report/user/info
curl -s "$API_BASE/report/user/info?UserList=101,102" \
-H "Authorization: Bearer $TOKEN" \
-H "apikey: $API_KEY"
Empty UserList is treated as all users (AllUsers=1) inside the handler.
Hourly customizable — processed / unprocessed
Processed (GET/POST /report/hourly/customizable/processed):
| Parameter | Notes |
|---|---|
StartDate, EndDate |
Range |
AllUsers / UserList |
"1" for all, else csv |
AllAccountCodes / AccountCodeList |
Same pattern |
GroupType |
e.g. User, Job Title, Supervisor, Customer, Account Code, Date, None |
IncludeExtendedData, IncludeWorkDescription |
"0" / "1" |
ReportType |
Summary (default) or Detailed |
curl -s "$API_BASE/report/hourly/customizable/processed?StartDate=2026-01-01&EndDate=2026-01-31&AllUsers=1&AllAccountCodes=1&ReportType=Summary" \
-H "Authorization: Bearer $TOKEN" \
-H "apikey: $API_KEY"
curl -s -X POST "$API_BASE/report/hourly/customizable/processed" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-H "apikey: $API_KEY" \
-d '{
"StartDate": "2026-01-01",
"EndDate": "2026-01-31",
"AllUsers": "0",
"UserList": "101,102",
"AllAccountCodes": "1",
"ReportType": "Detailed",
"IncludeWorkDescription": "1"
}'
Unprocessed adds filters such as Signed, Approved, TimeClass, RecordStatus, FullTextSearch, IncludeGroupsWithNoRecords.
Hourly helpers
| Path | Purpose | Key params |
|---|---|---|
/report/hourly/filter/items |
Filter option lists for UI | dates, UserList, AccountCodeList, Signed, Approved, TimeClass, RecordStatus |
/report/hourly/location |
Location report | StartDate, EndDate, AllUsers, UserList |
/report/hourly/record/overlapping |
Overlapping time | same |
/report/hourly/record/history |
Record history report | StartDate, EndDate, UserID, IncludeOnlyRecordsWithAlerts |
Hourly payroll
# List periods
curl -s "$API_BASE/report/hourly/payroll/periods?StartDate=2026-01-01&EndDate=2026-06-30&MaxRows=20" \
-H "Authorization: Bearer $TOKEN" -H "apikey: $API_KEY"
# One period
curl -s "$API_BASE/report/hourly/payroll/period/42?UserList=101,102" \
-H "Authorization: Bearer $TOKEN" -H "apikey: $API_KEY"
# Preview (GET or POST)
curl -s -X POST "$API_BASE/report/hourly/payroll/preview" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-H "apikey: $API_KEY" \
-d '{
"PayrollRunType": "NEW",
"StartDate": "2026-01-01",
"EndDate": "2026-01-15",
"UserSelect": "SelectedUsers",
"UserList": "101,102"
}'
Project customizable — GET/POST /report/project/customizable
Filters include users, customers, projects, account codes, Signed/Approved/Billable/RecordStatus, rate flags, GroupType, FullTextSearch, ReportType.
curl -s -X POST "$API_BASE/report/project/customizable" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-H "apikey: $API_KEY" \
-d '{
"StartDate": "2026-01-01",
"EndDate": "2026-01-31",
"AllUsers": "1",
"AllCustomers": "1",
"AllProjects": "1",
"AllAccountCodes": "1",
"ReportType": "Summary"
}'
Filter items: GET /report/project/filter/items.
Expense customizable — GET/POST /report/expense/customizable
Adds vendor and event list filters (AllVendors / VendorList, AllEvents / EventList) on top of the usual user/customer/project/account-code dimensions.
curl -s -X POST "$API_BASE/report/expense/customizable" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-H "apikey: $API_KEY" \
-d '{
"StartDate": "2026-01-01",
"EndDate": "2026-01-31",
"AllUsers": "1",
"AllVendors": "1",
"AllEvents": "1",
"ReportType": "Detailed"
}'